Initial commit
2
.gitattributes
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Auto detect text files and perform LF normalization
|
||||||
|
* text=auto
|
||||||
42
README.md
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
# THEME - XING KONG 2024 - VSMOV CMS
|
||||||
|
|
||||||
|
## Demo
|
||||||
|
https://forum.ophim.cc/d/30-theme-xingkong
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
https://github.com/vsphim/vsmov-core
|
||||||
|
|
||||||
|
## Install
|
||||||
|
1. Tại thư mục của Project: `composer require vsmov/theme-xingkong`
|
||||||
|
2. Kích hoạt giao diện trong Admin Panel
|
||||||
|
|
||||||
|
## Update
|
||||||
|
1. Tại thư mục của Project: `composer update vsmov/theme-xingkong`
|
||||||
|
2. Re-Activate giao diện trong Admin Panel
|
||||||
|
|
||||||
|
## Note
|
||||||
|
- Một vài lưu ý quan trọng của các nút chức năng:
|
||||||
|
+ `Activate` và `Re-Activate` sẽ publish toàn bộ file js,css trong themes ra ngoài public của laravel.
|
||||||
|
+ `Reset` reset lại toàn bộ cấu hình của themes
|
||||||
|
|
||||||
|
## Document
|
||||||
|
### List
|
||||||
|
- Home page: `display_label|display_description|relation|find_by_field|value|sort_by_field|sort_algo|limit|show_more_url|section_template(default|with_top)`
|
||||||
|
####
|
||||||
|
Phim chiếu rạp mới||is_shown_in_theater|1|created_at|desc|12|/danh-sach/phim-chieu-rap|default
|
||||||
|
Phim bộ mới||type|series|updated_at|desc|10|/danh-sach/phim-bo|with_top
|
||||||
|
Phim lẻ mới||type|single|updated_at|desc|10|/danh-sach/phim-le|with_top
|
||||||
|
Phim hoạt hình mới|categories|slug|hoat-hinh|updated_at|desc|10|/the-loai/hoat-hinh|with_top
|
||||||
|
####
|
||||||
|
|
||||||
|
- Cột phải: `Label|relation|find_by_field|value|sort_by_field|sort_algo|limit`
|
||||||
|
####
|
||||||
|
Top phim lẻ||type|single|view_week|desc|8
|
||||||
|
Top phim bộ||type|series|view_week|desc|8
|
||||||
|
Phim sắp chiếu||status|trailer|publish_year|desc|8
|
||||||
|
####
|
||||||
|
|
||||||
|
### Custom View Blade
|
||||||
|
- File blade gốc trong Package: `/vendor/vsmov/theme-xingkong/resources/views/themexingkong`
|
||||||
|
- Copy file cần custom đến: `/resources/views/vendor/themes/xingkong`
|
||||||
|
|
||||||
32
composer.json
Executable file
@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"name": "vsmov/theme-xingkong",
|
||||||
|
"description": "VsMov's xingkong theme",
|
||||||
|
"type": "library",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "vsmov",
|
||||||
|
"email": "vsmov@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"laravel/framework": "^6|^7|^8",
|
||||||
|
"ckfinder/ckfinder-laravel-package": "v3.5.2.1",
|
||||||
|
"vsmov/vsmov-core": "^1.0.0"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"VsMov\\ThemeXingKong\\": "src/",
|
||||||
|
"VsMov\\ThemeXingKong\\Database\\Factories\\": "database/factories/",
|
||||||
|
"VsMov\\ThemeXingKong\\Database\\Seeders\\": "database/seeders/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"laravel": {
|
||||||
|
"providers": [
|
||||||
|
"VsMov\\ThemeXingKong\\ThemeXingKongServiceProvider"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"minimum-stability": "stable"
|
||||||
|
}
|
||||||
BIN
resources/.DS_Store
vendored
Normal file
BIN
resources/assets/.DS_Store
vendored
Normal file
157
resources/assets/css/iconfont.css
Normal file
0
resources/assets/css/index.html
Normal file
519
resources/assets/css/stui_block.css
Normal file
@ -0,0 +1,519 @@
|
|||||||
|
/*!
|
||||||
|
* v3.0 Copyright http://v.shoutu.cn
|
||||||
|
* email 726662013@qq.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
@charset "utf-8";
|
||||||
|
|
||||||
|
/* all */
|
||||||
|
body, html{width:100%;}
|
||||||
|
body{ margin: 0; font-family:"Roboto", sans-serif; font-size:14px; line-height: 140%}
|
||||||
|
ul,ol,li,p,h1,h2,h3,h4,h5,h6,form,fieldset,table,td,img,tr,dl,dd,dt{margin:0;padding:0; font-weight:normal}
|
||||||
|
input,select{font-size:12px;vertical-align:middle; border:none;}
|
||||||
|
ul,li{list-style-type:none;}
|
||||||
|
img{border:0 none;}
|
||||||
|
p{margin:0 0 10px;}
|
||||||
|
|
||||||
|
/* container */
|
||||||
|
*{-webkit-box-sizing:border-box; -moz-box-sizing:border-box; box-sizing:border-box}
|
||||||
|
:after,:before{-webkit-box-sizing:border-box; -moz-box-sizing:border-box; box-sizing:border-box}
|
||||||
|
.container {position: relative; padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto;}
|
||||||
|
.row{position: relative; margin-right: -15px; margin-left: -15px;}
|
||||||
|
.container:before,.container:after,.row:before,.row:after,.clearfix:before, .clearfix:after{ display: table; content: " "; clear: both;}
|
||||||
|
|
||||||
|
/* col */
|
||||||
|
.col-pd,.col-lg-1,.col-lg-10,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding:10px}.col-xs-1,.col-xs-10,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-wide-1,.col-xs-wide-10,.col-xs-wide-15,.col-xs-wide-2,.col-xs-wide-25,.col-xs-wide-3,.col-xs-wide-35,.col-xs-wide-4,.col-xs-wide-45,.col-xs-wide-5,.col-xs-wide-55,.col-xs-wide-6,.col-xs-wide-65,.col-xs-wide-7,.col-xs-wide-75,.col-xs-wide-8,.col-xs-wide-85,.col-xs-wide-9,.col-xs-wide-95{float:left}.col-xs-10{width:10%}.col-xs-9{width:11.1111111%}.col-xs-8{width:12.5%}.col-xs-7{width:14.2857143%}.col-xs-6{width:16.6666667%}.col-xs-5{width:20%}.col-xs-4{width:25%}.col-xs-3{width:33.3333333%}.col-xs-2{width:50%}.col-xs-1{width:100%}.col-xs-wide-10{width:10%}.col-xs-wide-9{width:90%}.col-xs-wide-8{width:80%}.col-xs-wide-7{width:70%}.col-xs-wide-6{width:60%}.col-xs-wide-5{width:50%}.col-xs-wide-4{width:40%}.col-xs-wide-3{width:30%}.col-xs-wide-2{width:20%}.col-xs-wide-15{width:15%}.col-xs-wide-95{width:95%}.col-xs-wide-85{width:85%}.col-xs-wide-75{width:75%}.col-xs-wide-65{width:65%}.col-xs-wide-55{width:55%}.col-xs-wide-45{width:45%}.col-xs-wide-35{width:35%}.col-xs-wide-25{width:25%}
|
||||||
|
|
||||||
|
@media (min-width: 768px){
|
||||||
|
.col-sm-1,.col-sm-10,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-wide-1,.col-sm-wide-10,.col-sm-wide-15,.col-sm-wide-2,.col-sm-wide-25,.col-sm-wide-3,.col-sm-wide-35,.col-sm-wide-4,.col-sm-wide-45,.col-sm-wide-5,.col-sm-wide-55,.col-sm-wide-6,.col-sm-wide-65,.col-sm-wide-7,.col-sm-wide-75,.col-sm-wide-8,.col-sm-wide-85,.col-sm-wide-9,.col-sm-wide-95{float:left}.col-sm-10{width:10%}.col-sm-9{width:11.1111111%}.col-sm-8{width:12.5%}.col-sm-7{width:14.2857143%}.col-sm-6{width:16.6666667%}.col-sm-5{width:20%}.col-sm-4{width:25%}.col-sm-3{width:33.3333333%}.col-sm-2{width:50%}.col-sm-1{width:100%}.col-sm-wide-10{width:10%}.col-sm-wide-9{width:90%}.col-sm-wide-8{width:80%}.col-sm-wide-7{width:70%}.col-sm-wide-6{width:60%}.col-sm-wide-5{width:50%}.col-sm-wide-4{width:40%}.col-sm-wide-3{width:30%}.col-sm-wide-2{width:20%}.col-sm-wide-15{width:15%}.col-sm-wide-95{width:95%}.col-sm-wide-85{width:85%}.col-sm-wide-75{width:75%}.col-sm-wide-65{width:65%}.col-sm-wide-55{width:55%}.col-sm-wide-45{width:45%}.col-sm-wide-35{width:35%}.col-sm-wide-25{width:25%}}
|
||||||
|
|
||||||
|
@media (min-width: 992px){
|
||||||
|
.col-md-1,.col-md-10,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-wide-1,.col-md-wide-10,.col-md-wide-15,.col-md-wide-2,.col-md-wide-25,.col-md-wide-3,.col-md-wide-35,.col-md-wide-4,.col-md-wide-45,.col-md-wide-5,.col-md-wide-55,.col-md-wide-6,.col-md-wide-65,.col-md-wide-7,.col-md-wide-75,.col-md-wide-8,.col-md-wide-85,.col-md-wide-9,.col-md-wide-95{float:left}.col-md-10{width:10%}.col-md-9{width:11.1111111%}.col-md-8{width:12.5%}.col-md-7{width:14.2857143%}.col-md-6{width:16.6666667%}.col-md-5{width:20%}.col-md-4{width:25%}.col-md-3{width:33.3333333%}.col-md-2{width:50%}.col-md-1{width:100%}.col-md-wide-10{width:10%}.col-md-wide-9{width:90%}.col-md-wide-8{width:80%}.col-md-wide-7{width:70%}.col-md-wide-6{width:60%}.col-md-wide-5{width:50%}.col-md-wide-4{width:40%}.col-md-wide-3{width:30%}.col-md-wide-2{width:20%}.col-md-wide-15{width:15%}.col-md-wide-95{width:95%}.col-md-wide-85{width:85%}.col-md-wide-75{width:75%}.col-md-wide-65{width:65%}.col-md-wide-55{width:55%}.col-md-wide-45{width:45%}.col-md-wide-35{width:35%}.col-md-wide-25{width:25%}}
|
||||||
|
|
||||||
|
@media (min-width: 1200px){
|
||||||
|
.col-lg-1,.col-lg-10,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-wide-1,.col-lg-wide-10,.col-lg-wide-15,.col-lg-wide-2,.col-lg-wide-25,.col-lg-wide-3,.col-lg-wide-35,.col-lg-wide-4,.col-lg-wide-45,.col-lg-wide-5,.col-lg-wide-55,.col-lg-wide-6,.col-lg-wide-65,.col-lg-wide-7,.col-lg-wide-75,.col-lg-wide-8,.col-lg-wide-85,.col-lg-wide-9,.col-lg-wide-95{float:left}.col-lg-10{width:10%}.col-lg-9{width:11.1111111%}.col-lg-8{width:12.5%}.col-lg-7{width:14.2857143%}.col-lg-6{width:16.6666667%}.col-lg-5{width:20%}.col-lg-4{width:25%}.col-lg-3{width:33.3333333%}.col-lg-2{width:50%}.col-lg-1{width:100%}.col-lg-wide-10{width:10%}.col-lg-wide-9{width:90%}.col-lg-wide-8{width:80%}.col-lg-wide-7{width:70%}.col-lg-wide-6{width:60%}.col-lg-wide-5{width:50%}.col-lg-wide-4{width:40%}.col-lg-wide-3{width:30%}.col-lg-wide-2{width:20%}.col-lg-wide-15{width:15%}.col-lg-wide-95{width:95%}.col-lg-wide-85{width:85%}.col-lg-wide-75{width:75%}.col-lg-wide-65{width:65%}.col-lg-wide-55{width:55%}.col-lg-wide-45{width:45%}.col-lg-wide-35{width:35%}.col-lg-wide-25{width:25%}}
|
||||||
|
|
||||||
|
@media (max-width: 767px){[class*=col-]{padding:5px}}
|
||||||
|
|
||||||
|
/* text */
|
||||||
|
h1{ font-size:22px; line-height: 28px;}
|
||||||
|
h2{ font-size:20px; line-height: 26px;}
|
||||||
|
h3{ font-size:18px; line-height: 24px;}
|
||||||
|
h4{ font-size:16px; line-height: 22px;}
|
||||||
|
h5{ font-size:14px; line-height: 20px;}
|
||||||
|
h6{ font-size:12px; line-height: 18px;}
|
||||||
|
h1,h2,h3,h4,h5,h6{ font-weight: 400; margin-top:10px; margin-bottom:10px}
|
||||||
|
a,button{ text-decoration:none; outline:none; -webkit-tap-highlight-color:rgba(0,0,0,0)}
|
||||||
|
button:hover{ cursor: pointer;}
|
||||||
|
a:focus,a:hover,a:active{ text-decoration:none;}
|
||||||
|
.icon{ font-size: 16px; vertical-align: -1px;}
|
||||||
|
.font-16{ font-size: 16px;}
|
||||||
|
.font-14{ font-size: 14px;}
|
||||||
|
.font-12{ font-size: 12px;}
|
||||||
|
.text-center{ text-align: center;}
|
||||||
|
.text-left{ text-align: left;}
|
||||||
|
.text-right{ text-align: right;}
|
||||||
|
.text-overflow{ width:100%; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap;}
|
||||||
|
|
||||||
|
/* img */
|
||||||
|
img{border: 0; vertical-align:middle}
|
||||||
|
.img-circle{ border-radius: 50%;}
|
||||||
|
.img-rounded{ border-radius: 5px;}
|
||||||
|
.img-thumbnail{ padding: 5px; border-radius: 5px;}
|
||||||
|
.img-responsive{ max-width: 100%;}
|
||||||
|
|
||||||
|
/* form */
|
||||||
|
input,textarea{outline: medium none; outline: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);}
|
||||||
|
input.form-control,input.btn{ outline:0px; -webkit-appearance: none;}
|
||||||
|
input[type="checkbox"]{ vertical-align: -2px;}
|
||||||
|
.form-control{display:block; width:100%; height:30px; padding: 10px; font-size:12px; line-height: 25px; border-radius:4px; transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;}
|
||||||
|
textarea.form-control{ height: auto;}
|
||||||
|
.input-list{ margin-bottom: 20px;}
|
||||||
|
.input-list li{ padding: 10px 20px;}
|
||||||
|
.input-list li input.form-control{ height: 40px;}
|
||||||
|
#form-filter .form-control{padding: 5px;}
|
||||||
|
|
||||||
|
/* line */
|
||||||
|
.split-line{display: inline-block; margin-left: 12px; margin-right: 12px; width: 1px; height: 14px; vertical-align: -2px;}
|
||||||
|
.top-line,.top-line-dot,.bottom-line,.bottom-line-dot{ position: relative;}
|
||||||
|
.top-line:before,.top-line-dot:before{content: " "; position: absolute; left: 0; top: 0; right: 0; width: 100%; height: 1px;}
|
||||||
|
.bottom-line:after,.bottom-line-dot:before{content: " "; position: absolute; left: 0; bottom: 0; right: 0; width: 100%; height: 1px;}
|
||||||
|
|
||||||
|
/* badge */
|
||||||
|
.badge{display: inline-block; margin-right: 10px; width: 18px; height: 18px; text-align: center; line-height: 18px; border-radius: 2px; font-size: 12px;}
|
||||||
|
.badge-radius{ border-radius: 50%;}
|
||||||
|
|
||||||
|
/* btn */
|
||||||
|
.btn{display: inline-block; padding: 6px 30px; font-size: 12px; border-radius: 4px;}
|
||||||
|
.btn .icon{ font-size: 12px;}
|
||||||
|
.btn-min{ padding: 4px 15px;}
|
||||||
|
.btn-lg{ padding: 12px 30px;}
|
||||||
|
.btn-block{ display: block; width: 100%; text-align: center;}
|
||||||
|
.btn.disabled{cursor: not-allowed;}
|
||||||
|
|
||||||
|
/* tag */
|
||||||
|
.tag{ padding-left: 10px;}
|
||||||
|
.tag li{ float: left;}
|
||||||
|
.tag-btn,.tag-type{ padding-top: 10px; padding-left: 10px;}
|
||||||
|
.tag-btn li ,.tag-type li{ padding:0 10px 10px 0;}
|
||||||
|
.tag-btn li a ,.tag-type li a{ display: block; padding:0 10px; height: 30px; line-height: 30px; text-align: center; font-size: 12px; border-radius: 2px;}
|
||||||
|
.tag-btn.active li a,.tag-type.active li a{ border-radius: 14px;}
|
||||||
|
.tag-text li{ padding-right: 10px; padding-bottom: 10px;}
|
||||||
|
|
||||||
|
/* nav */
|
||||||
|
.nav{ height: 30px;}
|
||||||
|
.nav > li{ float: left;}
|
||||||
|
.nav-head > li{ margin-top: 5px; margin-right: 30px;}
|
||||||
|
.nav-head > li > a{ padding-bottom: 12px; font-size: 16px;}
|
||||||
|
.nav-tabs > li{margin-left: 30px;}
|
||||||
|
.nav-tabs > li > a{display: inline-block; padding: 8px 0 10px;}
|
||||||
|
.nav-tag > li{ margin-left: 10px;}
|
||||||
|
.nav-tag > li > a{ display: inline-block; padding:0 10px; height: 25px; line-height: 23px; font-size: 12px; border-radius: 20px;}
|
||||||
|
.nav-text > li{line-height: 30px;}
|
||||||
|
.nav-text > li.active > a{ color: #f80;}
|
||||||
|
.nav-page{ margin-left: 10px;}
|
||||||
|
.nav-page > li{ margin-left: 5px;}
|
||||||
|
.nav-page > li > a{ display: inline-block; font-size: 12px; padding: 0 6px; height: 25px; line-height: 23px;}
|
||||||
|
.nav-page > li > a > .icon{ font-size: 12px;}
|
||||||
|
.nav-page > li:first-child{ margin-left: 0;}
|
||||||
|
.nav-page > li:first-child > a{ border-radius: 4px 0 0 4px;}
|
||||||
|
.nav-page > li:last-child > a{ border-radius: 0 4px 4px 0;}
|
||||||
|
|
||||||
|
/* pic-tag */
|
||||||
|
.pic-tag{ position: absolute; z-index: 99; padding:2px 5px; font-size: 12px; border-radius: 2px;}
|
||||||
|
.pic-tag-t{top: 5px; left: 5px;}
|
||||||
|
.pic-tag-l{bottom: 5px; left: 5px;}
|
||||||
|
.pic-tag-b{bottom: 5px; right: 5px;}
|
||||||
|
.pic-tag-r{top: 5px; right: 5px;}
|
||||||
|
.pic-tag-h{left: 0; top: 0; padding:2px 8px; border-radius: 0 0 8px 0;}
|
||||||
|
.pic-tag-lg{ padding: 4px 10px;}
|
||||||
|
.pic-text{display: block; width: 100%; position: absolute; bottom: 0; left: 0; padding:5px 10px; font-size: 12px; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap;}
|
||||||
|
.pic-text-silde{ padding-bottom: 20px; font-size: 14px;}
|
||||||
|
.pic-text-lg{ padding: 8px 20px; font-size: 14px;}
|
||||||
|
.pic-title-t{display: block; width: 100%; position: absolute; top: 0; left: 0; padding:5px 10px 10px; font-size: 12px; word-break:break-all; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;}
|
||||||
|
.pic-title-b{display: block; width: 100%; position: absolute; bottom: 0; left: 0; padding:5px 10px; font-size: 12px; word-break:break-all; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;}
|
||||||
|
|
||||||
|
/* pannel */
|
||||||
|
.stui-pannel{position: relative; margin-bottom: 20px;}
|
||||||
|
.stui-pannel.stui-pannel-x{ margin: -10px -10px 10px;}
|
||||||
|
.stui-pannel-bg{border-radius: 2px;}
|
||||||
|
.stui-pannel-side{ padding: 0 0 0 20px;}
|
||||||
|
.stui-pannel-box{ padding: 10px;}
|
||||||
|
.stui-pannel-box.active{ padding: 0; margin: -10px;}
|
||||||
|
.stui-pannel_hd{ padding: 10px;}
|
||||||
|
.stui-pannel_ft{ margin-top: 10px; padding: 10px 10px 0; text-align: center;}
|
||||||
|
|
||||||
|
/* pannel-head */
|
||||||
|
.stui-pannel__head{ position: relative; height: 30px;}
|
||||||
|
.stui-pannel__head.active{height: 40px;}
|
||||||
|
.stui-pannel__head .title{float: left; margin:0; padding-right: 10px; line-height: 24px;}
|
||||||
|
.stui-pannel__head .title img{ display: inline-block; width: 24px; height: 24px; margin-right: 10px; vertical-align: -5px;}
|
||||||
|
.stui-pannel__head .more{ line-height: 30px;}
|
||||||
|
|
||||||
|
/* tabbar */
|
||||||
|
.stui_nav__taddar .item{ display: block; text-align: center;}
|
||||||
|
.stui_nav__taddar .item .icon{ display: block; text-align: center; font-size: 20px; line-height: 20px;}
|
||||||
|
.stui_nav__taddar .item .icon-img{display: inline-block; width: 24px; height: 24px;}
|
||||||
|
.stui_nav__taddar .item .title{ display: block; margin-top: 3px; font-size: 12px;;}
|
||||||
|
.stui_nav__taddar.fixed{ position: fixed; bottom: 0; width: 100%; padding: 5px 0 0;}
|
||||||
|
|
||||||
|
/* vod-list */
|
||||||
|
.stui-vodlist__thumb{display: block; position: relative; padding-top: 150%; background: url(/themes/xingkong/img/load.gif) no-repeat; background-position: 50% 50%; background-size: cover;}
|
||||||
|
.stui-vodlist__thumb.square{ padding-top: 100%; background: url(/themes/xingkong/img/load_f.gif) no-repeat; background-position: 50% 50%; background-size: cover;}
|
||||||
|
.stui-vodlist__thumb.active{ padding-top: 60%; background: url(/themes/xingkong/img/load_w.gif) no-repeat; background-position: 50% 50%; background-size: cover;}
|
||||||
|
.stui-vodlist__thumb.picture {background: none; overflow: hidden;}
|
||||||
|
.stui-vodlist__thumb.picture img{position: absolute; top: 0; left: 0; width: 100%; height: 100%;}
|
||||||
|
.stui-vodlist__thumb .play{display: none; position: absolute; top: 0; z-index: 1; width: 100%; height: 100%; background: rgba(0,0,0,0.1) url(/themes/xingkong/img/play.png) center no-repeat;}
|
||||||
|
.stui-vodlist__thumb .play.active{ display: block;}
|
||||||
|
.stui-vodlist__thumb:hover .play{ display: block;}
|
||||||
|
.stui-vodlist__detail.active{ padding: 0 10px 10px;}
|
||||||
|
.stui-vodlist__detail .title{ font-size: 14px; margin-bottom: 0;}
|
||||||
|
.stui-vodlist__detail .title.active{ font-size: 16px; margin-bottom: 10px;}
|
||||||
|
.stui-vodlist__detail .text{ min-height: 19px; font-size: 12px; margin-bottom: 0; margin-top: 5px;}
|
||||||
|
.stui-vodlist__detail .text-title{ font-size: 14px; line-height: 18px; margin:11px 0 0; height: 36px; overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2;}
|
||||||
|
|
||||||
|
/* text-list */
|
||||||
|
.stui-vodlist__text li a{ display: block; padding: 10px 15px 10px 0;}
|
||||||
|
.stui-vodlist__text.active li a{ padding: 10px 0 10px;}
|
||||||
|
.stui-vodlist__text.active li:first-child a{ padding-top: 0;}
|
||||||
|
.stui-vodlist__text.striped li{ padding: 10px 0 10px;}
|
||||||
|
.stui-vodlist__text.striped li a{ display: inline-block; padding: 0;}
|
||||||
|
.stui-vodlist__text.striped .striped-head{ padding: 10px; border-radius: 5px;}
|
||||||
|
.stui-vodlist__text.to-color li{ padding: 10px; border-radius: 5px;}
|
||||||
|
.stui-vodlist__text.to-color li a{ padding: 0;}
|
||||||
|
.stui-vodlist__text.downlist{ padding-top: 0;}
|
||||||
|
.stui-vodlist__text.downlist li{ padding: 10px 0;}
|
||||||
|
.stui-vodlist__text.downlist li .text{ line-height: 30px; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap;}
|
||||||
|
.stui-vodlist__text.downlist li a{ display: inline-block; padding: 0;}
|
||||||
|
.stui-vodlist__text.downlist li a.btn{ padding: 4px 12px; margin-left: 10px;}
|
||||||
|
|
||||||
|
/* media-list */
|
||||||
|
.stui-vodlist__media li { padding: 10px 0 10px;}
|
||||||
|
.stui-vodlist__media.active li:first-child{ padding-top: 0;}
|
||||||
|
.stui-vodlist__media.active li:last-child{ padding-bottom: 0;}
|
||||||
|
.stui-vodlist__media li .thumb,.stui-vodlist__media .detail{display: table-cell; vertical-align: top;}
|
||||||
|
.stui-vodlist__media li .thumb .w-thumb{ width: 190px;}
|
||||||
|
.stui-vodlist__media li .thumb .v-thumb{ width: 120px;}
|
||||||
|
.stui-vodlist__media li .thumb .f-thumb{ width: 120px;}
|
||||||
|
.stui-vodlist__media li .thumb .m-thumb{ width: 65px;}
|
||||||
|
.stui-vodlist__media li .detail{ width: 100%; padding:0 20px 0;}
|
||||||
|
.stui-vodlist__media li .detail-side{ padding:0 10px 0;}
|
||||||
|
.stui-vodlist__media li .detail-left{ padding: 0 20px 0 0;}
|
||||||
|
.stui-vodlist__media li .detail .title{ margin: 10px 0 10px;}
|
||||||
|
|
||||||
|
/* screen-list */
|
||||||
|
.stui-vodlist__screen { padding:10px 0 5px;}
|
||||||
|
.stui-vodlist__screen:first-child{ padding-top: 0;}
|
||||||
|
.stui-vodlist__screen:last-child{ padding-bottom: 0;}
|
||||||
|
.stui-vodlist__screen li{ float: left; width: 25%; margin-bottom: 5px;}
|
||||||
|
|
||||||
|
/* rank-list */
|
||||||
|
.stui-vodlist__rank li{ margin-bottom: 10px;}
|
||||||
|
.stui-vodlist__rank li:last-child{ margin-bottom: 0;}
|
||||||
|
|
||||||
|
/* link-list */
|
||||||
|
.stui-link__text li{ float: left; margin-right: 15px; margin-bottom: 10px;}
|
||||||
|
.stui-link__pic li a{ display: block; padding:10px 20px; border-radius: 4px;}
|
||||||
|
.stui-link__pic li a img{ max-width: 100%;}
|
||||||
|
|
||||||
|
/* play-list */
|
||||||
|
.stui-content__playlist{ position: relative;}
|
||||||
|
.stui-content__playlist.overflow{ max-height: 300px; overflow-y: scroll;}
|
||||||
|
.stui-content__playlist li{float:left; margin-bottom:10px; margin-right:10px}
|
||||||
|
.stui-content__playlist li a{display:inline-block; padding:5px 20px;border-radius:5px}
|
||||||
|
.stui-content__playlist.full li{ float: none; width: 100%; margin-right: 0;}
|
||||||
|
.stui-content__playlist.column3 li{ width: 33.3333333%; padding: 0 5px; margin-right: 0;}
|
||||||
|
.stui-content__playlist.column6 li{ width: 16.6666667%; padding: 0 5px; margin-right: 0;}
|
||||||
|
.stui-content__playlist.column8 li{ width: 12.5%; padding: 0 5px; margin-right: 0;}
|
||||||
|
.stui-content__playlist.column8 li.more,.stui-content__playlist.column10 li.narrow{ width: 15%;}
|
||||||
|
.stui-content__playlist.column10 li{ width: 10%; padding: 0 5px; margin-right: 0;}
|
||||||
|
.stui-content__playlist.column10 li.more,.stui-content__playlist.column10 li.narrow{ width: 20%;}
|
||||||
|
.stui-content__playlist.column12 li{ width: 8.33333333%; padding: 0 5px; margin-right: 0;}
|
||||||
|
.stui-content__playlist.column12 li.more,.stui-content__playlist.column12 li.narrow{ width: 16.6666667%;}
|
||||||
|
.stui-content__playlist.column3,.stui-content__playlist.column6,.stui-content__playlist.column8,.stui-content__playlist.column10,.stui-content__playlist.column12{ margin: 0 -5px;}
|
||||||
|
.stui-content__playlist.column3 li a,.stui-content__playlist.column6 li a,.stui-content__playlist.column8 li a,.stui-content__playlist.column10 li a,.stui-content__playlist.column12 li a{ padding: 5px;}
|
||||||
|
.stui-content__playlist.full li a,.stui-content__playlist.column3 li a,.stui-content__playlist.column6 li a,.stui-content__playlist.column8 li a,.stui-content__playlist.column10 li a,.stui-content__playlist.column12 li a{ display: block; text-align: center;overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap;}
|
||||||
|
|
||||||
|
/* screen */
|
||||||
|
.stui-screen__list{position:relative;padding:10px 0 0;}
|
||||||
|
.stui-screen__list li{float:left;margin-right:10px;margin-bottom:10px}
|
||||||
|
.stui-screen__list li span{display:inline-block;padding:3px 0 3px}
|
||||||
|
.stui-screen__list li a{display:inline-block;padding:3px 10px;border-radius:2px}
|
||||||
|
.stui-screen__list.letter-list li{ margin: 0;}
|
||||||
|
.stui-screen__list.letter-list li:first-child{ margin-right: 10px;}
|
||||||
|
.stui-screen__list.letter-list li.active a{padding:3px 10px}
|
||||||
|
|
||||||
|
/* page */
|
||||||
|
.stui-page{margin-bottom:30px;display: flex;justify-content: center;justify-items: center;}.stui-page li{display:inline-block;margin-left:10px}
|
||||||
|
.stui-page li .num,.stui-page li a{display:inline-block;padding:5px 15px;border-radius:5px}
|
||||||
|
.stui-page-text{ padding:0 20px 20px;}
|
||||||
|
.stui-page-text a,.stui-page-text em,.stui-page-text span{font-style:normal;display:inline-block;margin:0;padding:6px 12px;border-radius:2px;cursor:pointer}
|
||||||
|
.stui-page-text .pagego{ padding: 6px; margin-right: 5px;border-radius: 5;}
|
||||||
|
.stui-page-text .pagebtn{ padding: 6px 12px; cursor: pointer;}
|
||||||
|
|
||||||
|
/* extra */
|
||||||
|
.stui-extra{position:fixed;right:50px;bottom:50px}
|
||||||
|
.stui-extra li{position:relative;padding:15px 10px 0}
|
||||||
|
.stui-extra li a,.stui-extra li span{display:block;width:50px;height:50px;line-height:50px;text-align:center;border-radius:4px;font-size:18px;cursor:pointer}
|
||||||
|
.stui-extra li a .icon,.stui-extra li span .icon{font-size:18px}
|
||||||
|
.stui-extra li a img{margin-top:15px;width:20px;height:20px}
|
||||||
|
.stui-extra li .sideslip{display:none;position:absolute;bottom:0;right:100%;width: 160px;}
|
||||||
|
.stui-extra li .sideslip:before{content:" ";width:10px;height:10px;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);border-width:0 1px 1px 0;position:absolute;bottom:20px;right:-6px;border-style:solid}
|
||||||
|
.stui-extra li:hover .sideslip{display:block}
|
||||||
|
|
||||||
|
/* flickity */
|
||||||
|
.flickity-enabled{position:relative;}
|
||||||
|
.flickity-enabled:focus{outline:0}
|
||||||
|
.flickity-viewport{overflow:hidden;position:relative;height:100%}
|
||||||
|
.flickity-slider{position:absolute;width:100%;height:100%}
|
||||||
|
.flickity-viewport.is-pointer-down{cursor:-webkit-grabbing;cursor:grabbing}
|
||||||
|
.flickity-prev-next-button{position:absolute;top:50%;width:30px;height:60px;border:none; background-color: rgba(0,0,0,.6); cursor:pointer;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}
|
||||||
|
.flickity-prev-next-button.previous{left:10px;border-radius:0 10px 10px 0}
|
||||||
|
.flickity-prev-next-button.next{right:10px;border-radius:10px 0 0 10px}
|
||||||
|
.flickity-prev-next-button:disabled{opacity:0;cursor:auto}
|
||||||
|
.flickity-prev-next-button svg{position:absolute;left:20%;top:20%;width:60%;height:60%}
|
||||||
|
.flickity-prev-next-button .arrow{fill:#fff}
|
||||||
|
.flickity-prev-next-button.no-svg{color:#fff;font-size:18px}
|
||||||
|
.flickity-page-dots{position:absolute;width:100%;bottom:20px;left:0;padding:0;margin:0;list-style:none;text-align:center;line-height:1}
|
||||||
|
.flickity-page-dots .dot{display:inline-block;width:15px;height:3px;margin:0 5px;background:#f80;opacity:.25;cursor:pointer}
|
||||||
|
.flickity-page-dots .dot.is-selected{opacity:1}
|
||||||
|
.flickity-page{ padding-bottom: 15px; overflow: hidden;}
|
||||||
|
.flickity-page .flickity-page-dots{ bottom: 5px;}
|
||||||
|
|
||||||
|
/* carousel */
|
||||||
|
.carousel{ position: relative; width: 100%; height:100%; overflow: hidden; white-space: nowrap;}
|
||||||
|
.carousel [class^="col-"]{ float: none; display: inline-block;}
|
||||||
|
.carousel .list{ padding: 0; margin-right: 20px;}
|
||||||
|
.carousel .wide{ width: 100%; display: inline-block;}
|
||||||
|
.carousel_center{ padding-bottom: 20px;}
|
||||||
|
.carousel_center .list a{ position: relative;}
|
||||||
|
.carousel_center .list a:before{ content: ""; position: absolute; z-index: 1; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,.6);}
|
||||||
|
.carousel_center .list.is-selected a:before{ display: none;}
|
||||||
|
|
||||||
|
/* popup */
|
||||||
|
.popup{position: fixed; right: -100%; top: 0; z-index: 1001; width: 100%; height: 100%; overflow-y: scroll; -webkit-overflow-scrolling: touch; -webkit-transition:.5s; -o-transition:.5s; -moz-transition:.5s; -ms-transition:.5s; transition:.5s;}
|
||||||
|
.popup-visible{ right: 0;}
|
||||||
|
.popup-head { padding: 15px 10px; margin-bottom: 10px;}
|
||||||
|
.popup-head .title{ display: inline-block; margin: 0;}
|
||||||
|
.popup-head .icon{ font-size: 20px;}
|
||||||
|
|
||||||
|
/* embed */
|
||||||
|
.embed-responsive{position:relative;display:block;overflow:hidden;padding:0;height:0}
|
||||||
|
.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}
|
||||||
|
.embed-responsive-16by9{padding-bottom:56.25%}
|
||||||
|
.embed-responsive-4by3{padding-bottom:75%}
|
||||||
|
|
||||||
|
/* bootstrap.js */
|
||||||
|
.fade{opacity: 0;-webkit-transition: opacity .15s linear;-o-transition: opacity .15s linear;transition: opacity .15s linear;}
|
||||||
|
.fade.in{opacity: 1;}
|
||||||
|
.tab-content>.tab-pane,.carousel-inner>.item{ display: none;}
|
||||||
|
.tab-content>.tab-pane.active,.carousel-inner>.item.active{ display: block;}
|
||||||
|
.dropdown{ position: relative;}
|
||||||
|
.dropdown-menu{display: none; position:absolute; top:100%; left:-80%; z-index:1000; padding: 10px 0; border-radius: 2px;}
|
||||||
|
.dropdown-menu:before{ content:" "; width:10px; height:10px; -webkit-transform:rotate(-45deg); -ms-transform:rotate(-45deg); transform:rotate(-45deg); border-width:1px 1px 0 0; position: absolute; top:-6px; right: 20px; border-style: solid;}
|
||||||
|
.dropdown-menu>li>a{display: block; padding: 6px 20px; text-align: center;}
|
||||||
|
.open>.dropdown-menu {display: block;}
|
||||||
|
.carousel-side{ position: absolute; z-index: 99; top: 0; bottom: 0; display: block; width: 100px; height: 100%;}
|
||||||
|
.carousel-side .icon{ position: absolute; top: 50%; margin-top: -25px; display: block; width: 50px; height: 50px; text-align: center; font-size: 30px; line-height: 50px; background-color: rgba(0,0,0,0.6); color: #fff; border-radius: 50%;}
|
||||||
|
.carousel-side.left{ left: 0;}
|
||||||
|
.carousel-side.left .icon{ left: 30px;}
|
||||||
|
.carousel-side.right{ right: 0; }
|
||||||
|
.carousel-side.right .icon{ right: 30px;}
|
||||||
|
.carousel-bootom{ position: absolute; width: 100%; bottom: 20px; left: 0; text-align: center;}
|
||||||
|
.carousel-bootom li{ display: inline-block; margin: 0 5px; width:15px; height:3px; background: #f80; opacity:.25; cursor:pointer}
|
||||||
|
.carousel-bootom li.active{ opacity:1;}
|
||||||
|
|
||||||
|
/* modal */
|
||||||
|
.stui-modal{position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 9999; display: none; overflow: hidden; -webkit-overflow-scrolling: touch; outline: 0;}
|
||||||
|
.stui-modal__dialog{position: relative; width: 350px; margin: 140px auto; }
|
||||||
|
.stui-modal__content{ position: relative; background-color: #fff; border-radius: 6px; outline: 0; box-shadow: 0 3px 9px rgba(0,0,0,.5);}
|
||||||
|
.modal-open{ overflow: hidden;}
|
||||||
|
.modal-backdrop{position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000;}
|
||||||
|
.modal-backdrop.fade{ opacity: 0;}
|
||||||
|
.modal-backdrop.fade.in{ opacity: .5;}
|
||||||
|
|
||||||
|
/* mobile-share */
|
||||||
|
.mobile-share{ position: fixed; z-index: 999; top: 0; bottom: 0; left: 0; width: 100%; height: 100%; animation: fade-in; animation-duration: .5s; -webkit-animation:fade-in .5s;}
|
||||||
|
.share-weixin{ background: url(../img/share_weixin.png) rgba(0, 0, 0, .8) no-repeat; background-position: right top 10px; background-size: 80%;}
|
||||||
|
.share-other{ background: url(../img/share_other.png) rgba(0, 0, 0, .8) no-repeat; background-position: center bottom 10px; background-size: 80%;}
|
||||||
|
|
||||||
|
/* more */
|
||||||
|
.relative{ position: relative;}
|
||||||
|
.top-fixed-up{ margin-top: 0 !important;}
|
||||||
|
.top-fixed{ -webkit-transition:.5s; -o-transition:.5s; -moz-transition:.5s; -ms-transition:.5s; transition:.5s;}
|
||||||
|
.pull-left{ float: left !important;}
|
||||||
|
.pull-right{ float: right !important;}
|
||||||
|
.margin-0{ margin: 0 !important;}
|
||||||
|
.padding-0{ padding: 0 !important;}
|
||||||
|
.margin-t0{ margin: 0 !important;}
|
||||||
|
.padding-t0{ padding: 0 !important;}
|
||||||
|
.margin-b0{ margin: 0 !important;}
|
||||||
|
.padding-b0{ padding: 0 !important;}
|
||||||
|
.block{ display: block !important;}
|
||||||
|
.inline-block{ display: inline-block !important;}
|
||||||
|
.hide,.visible-lg, .visible-md, .visible-sm, .visible-xs, .visible-mi{ display: none !important;}
|
||||||
|
.mask{ position: fixed; top: 0; left: 0; bottom: 0; z-index: 999; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.2); animation: fade-in; animation-duration: .5s; -webkit-animation:fade-in .5s;}
|
||||||
|
@keyframes fade-in {0% {opacity: 0;}40% {opacity: 0;}100% {opacity: 1;}}
|
||||||
|
@-webkit-keyframes fade-in { 0% {opacity: 0;} 40% {opacity: 0;}100% {opacity: 1;}}
|
||||||
|
|
||||||
|
@media (min-width: 1200px){
|
||||||
|
.visible-lg { display: block !important;}
|
||||||
|
.hidden-lg {display: none !important;}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1199px) and (min-width: 992px){
|
||||||
|
.visible-md { display: block !important;}
|
||||||
|
.hidden-md {display: none!important;}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 991px) and (min-width: 768px){
|
||||||
|
.visible-sm{ display: block !important;}
|
||||||
|
.hidden-sm {display: none !important;}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 991px){
|
||||||
|
|
||||||
|
.stui-pannel-side{ padding: 0;}
|
||||||
|
|
||||||
|
/* screen */
|
||||||
|
.stui-screen__list{ height: 40px; padding:10px 0 10px; overflow:hidden; white-space: nowrap;}
|
||||||
|
.stui-screen__list:last-child{ padding: 10px 0 0;}
|
||||||
|
.stui-screen__list li{ float: none; display: inline-block; margin-right:10px; margin-bottom:0}
|
||||||
|
.stui-screen__list li span{padding:2px 5px 2px 0}
|
||||||
|
.stui-screen__list li a{padding:2px 5px 2px; white-space:nowrap}
|
||||||
|
.stui-screen__list.letter-list li{ margin-right: 5px; margin-bottom: 0;}
|
||||||
|
.stui-screen__list.letter-list li a,.stui-screen__list.letter-list li.active a{padding:2px 5px 2px}
|
||||||
|
|
||||||
|
/* vod-list */
|
||||||
|
.stui-vodlist__detail .title.active{ font-size: 14px; margin-bottom: 0;}
|
||||||
|
|
||||||
|
/* media-list */
|
||||||
|
.stui-vodlist__media li .thumb .v-thumb{ width: 110px;}
|
||||||
|
.stui-vodlist__media li .thumb .w-thumb{ width: 130px;}
|
||||||
|
.stui-vodlist__media li .thumb .f-thumb{ width: 70px;}
|
||||||
|
|
||||||
|
/* play-list */
|
||||||
|
.stui-content__playlist{ -webkit-overflow-scrolling : touch;}
|
||||||
|
.stui-content__playlist.column3 li{ width: 50%;}
|
||||||
|
.stui-content__playlist.column6 li{ width: 25%;}
|
||||||
|
.stui-content__playlist.column8 li{ width: 20%;}
|
||||||
|
.stui-content__playlist.column10 li{ width: 16.6666667%;}
|
||||||
|
|
||||||
|
/* modal */
|
||||||
|
.stui-modal__dialog{ width: 320px; margin: 50px auto;}
|
||||||
|
|
||||||
|
@media (max-width: 767px){
|
||||||
|
.visible-xs { display: block !important;}
|
||||||
|
.hidden-xs {display: none!important;}
|
||||||
|
|
||||||
|
/* all */
|
||||||
|
body{ font-size: 12px;}
|
||||||
|
|
||||||
|
/* text */
|
||||||
|
h1{ font-size:20px; line-height: 24px;}
|
||||||
|
h2{ font-size:18px; line-height: 22px;}
|
||||||
|
h3{ font-size:16px; line-height: 20px;}
|
||||||
|
h4{ font-size:14px; line-height: 18px;}
|
||||||
|
h5{ font-size:12px; line-height: 16px;}
|
||||||
|
h6{ font-size:10px; line-height: 14px;}
|
||||||
|
|
||||||
|
/* btn */
|
||||||
|
.btn{padding: 6px 20px;}
|
||||||
|
.btn-min{ padding: 3px 8px;}
|
||||||
|
.btn-lg{ padding: 12px 24px;}
|
||||||
|
|
||||||
|
/*nav*/
|
||||||
|
.nav{ height: 20px;}
|
||||||
|
.nav-head > li{ margin-top: 2px; margin-right: 20px;}
|
||||||
|
.nav-head > li > a{ padding-bottom: 10px; font-size: 14px;}
|
||||||
|
.nav-tabs > li{ margin-left: 20px;}
|
||||||
|
.nav-tabs > li > a{padding: 6px 0 6px;}
|
||||||
|
.nav-page > li > a{ padding: 0 3px; height: 20px; line-height: 18px;}
|
||||||
|
|
||||||
|
/* pic-text */
|
||||||
|
.pic-text-silde{ font-size: 12px;}
|
||||||
|
|
||||||
|
/* line */
|
||||||
|
.split-line{ height: 12px; margin-left: 5px; margin-right: 5px;}
|
||||||
|
.top-line:before,.top-line-dot:before{-webkit-transform-origin: 0 0;transform-origin: 0 0;-webkit-transform: scaleY(0.5);transform: scaleY(0.5);}
|
||||||
|
.bottom-line:after,.bottom-line-dot:before{ -webkit-transform-origin: 0 100%;transform-origin: 0 100%; -webkit-transform: scaleY(0.5);transform: scaleY(0.5);}
|
||||||
|
.m-top-line,.m-top-line-dot,.m-bottom-line,.m-bottom-line-dot{ position: relative;}
|
||||||
|
.m-top-line:before,.m-top-line-dot:before{content: " "; position: absolute; left: 0; top: 0; right: 0; width: 100%; height: 1px; -webkit-transform-origin: 0 0;transform-origin: 0 0;-webkit-transform: scaleY(0.5);transform: scaleY(0.5);}
|
||||||
|
.m-bottom-line:after,.m-bottom-line-dot:before{content: " "; position: absolute; left: 0; bottom: 0; right: 0; width: 100%; height: 1px; -webkit-transform-origin: 0 100%;transform-origin: 0 100%; -webkit-transform: scaleY(0.5);transform: scaleY(0.5);}
|
||||||
|
|
||||||
|
/* pannel */
|
||||||
|
.stui-pannel{ margin-bottom: 10px;}
|
||||||
|
.stui-pannel.stui-pannel-x{ margin: 0 0 5px;}
|
||||||
|
.stui-pannel-bg{border-radius: 0;}
|
||||||
|
.stui-pannel-box{ padding:10px 5px;}
|
||||||
|
.stui-pannel-box.active{ margin:5px;}
|
||||||
|
.stui-pannel_hd{ padding:0 5px 10px;}
|
||||||
|
|
||||||
|
/* pannel-head */
|
||||||
|
.stui-pannel__head{ height: 20px;}
|
||||||
|
.stui-pannel__head.active{height: 30px;}
|
||||||
|
.stui-pannel__head .title,.stui-pannel__head .title a{font-size: 16px;}
|
||||||
|
.stui-pannel__head .title img{ width: 18px; height: 18px; margin-right: 5px; vertical-align: -3px;}
|
||||||
|
.stui-pannel__head .more{ line-height: 20px;}
|
||||||
|
|
||||||
|
/* vod-list */
|
||||||
|
.stui-vodlist__thumb .tag{ padding: 0 5px;}
|
||||||
|
.stui-vodlist__thumb .silde-title{ font-size: 12px;}
|
||||||
|
.stui-vodlist__detail .title,.stui-vodlist__detail .title.active{margin-bottom: 0; font-size: 12px;}
|
||||||
|
|
||||||
|
/* media-list */
|
||||||
|
.stui-vodlist__media li .thumb .v-thumb{ width: 100px;}
|
||||||
|
.stui-vodlist__media li .thumb .w-thumb{ width: 130px;}
|
||||||
|
.stui-vodlist__media li .thumb .f-thumb{ width: 70px;}
|
||||||
|
.stui-vodlist__media li .detail{ padding: 0 10px;}
|
||||||
|
.stui-vodlist__media li .detail.active{ padding-left: 0; padding-right: 10px;}
|
||||||
|
|
||||||
|
/* text-list */
|
||||||
|
.stui-vodlist__text li a{ padding:10px 0;}
|
||||||
|
.stui-vodlist__text.downlist li{ padding: 5px 0 0;}
|
||||||
|
|
||||||
|
/* play-list */
|
||||||
|
.stui-content__playlist li a{padding:5px 10px;font-size:12px}
|
||||||
|
.stui-content__playlist.column3 li{ float: none; width: 100%;}
|
||||||
|
.stui-content__playlist.column6 li,.stui-content__playlist.column8 li,.stui-content__playlist.column10 li,.stui-content__playlist.column12 li{ width: 25%;}
|
||||||
|
|
||||||
|
/* page */
|
||||||
|
.stui-page li{float:left;width:20%;margin:0;padding:0 5px 0 5px}
|
||||||
|
.stui-page li a,.stui-page__box li .num{display:block;padding:5px 0;text-align:center}
|
||||||
|
.stui-page li.page-item{ width: auto; margin-bottom: 5px;}
|
||||||
|
.stui-page li.page-item a{ padding: 5px 15px;}
|
||||||
|
|
||||||
|
/* extra */
|
||||||
|
.stui-extra{right:15px;bottom:15px}
|
||||||
|
.stui-extra li{padding:8px 0 0}
|
||||||
|
.stui-extra li a,.stui-extra li span{width:35px;height:35px;line-height:35px;font-size:16px}
|
||||||
|
.stui-extra li a .icon,.stui-extra li span .icon{font-size:16px}
|
||||||
|
.stui-extra li a img{margin-top:8px;width:18px;height:18px}
|
||||||
|
|
||||||
|
/* carousel */
|
||||||
|
.carousel .list{ margin-right: 10px;}
|
||||||
|
|
||||||
|
/* flickity */
|
||||||
|
.flickity-prev-next-button{display: none;}
|
||||||
|
.flickity-prev-next-button.previous{left:5px;border-radius:0 5px 5px 0}
|
||||||
|
.flickity-prev-next-button.next{right:5px;border-radius:5px 0 0 5px}
|
||||||
|
.flickity-page-dots{ bottom: 15px;}
|
||||||
|
|
||||||
|
/* modal */
|
||||||
|
.stui-modal__dialog{ width: 100%; margin: 0; padding: 50px 20px;}
|
||||||
|
|
||||||
|
.carousel-control{ width: 50px; height: 100%;}
|
||||||
|
.carousel-control .icon{ margin-top: -15px; width: 30px; height: 30px; font-size: 20px; line-height: 30px;}
|
||||||
|
.carousel-control.left .icon{ left: 10px;}
|
||||||
|
.carousel-control.right .icon{ right: 10px;}
|
||||||
|
|
||||||
|
}
|
||||||
|
@media (max-width: 374px){
|
||||||
|
.visible-mi{ display: block !important;}
|
||||||
|
.hidden-mi{display: none !important;}
|
||||||
|
|
||||||
|
/* media-list */
|
||||||
|
.stui-vodlist__media li .thumb .v-thumb{ width: 90px;}
|
||||||
|
.stui-vodlist__media li .thumb .w-thumb{ width: 100px;}
|
||||||
|
.stui-vodlist__media li .thumb .f-thumb{ width: 50px;}
|
||||||
|
}
|
||||||
183
resources/assets/css/stui_block_color.css
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
/*!
|
||||||
|
* Edition v3.0 Copyright 2016-2018 http://v.shoutu.cn
|
||||||
|
* Email 726662013@qq.com,admin@shoutu.cn
|
||||||
|
*/
|
||||||
|
@charset "utf-8";
|
||||||
|
|
||||||
|
/* all */
|
||||||
|
body{ background: url(/themes/xingkong/img/bg_icon.jpg); color: #666;}
|
||||||
|
|
||||||
|
/* text */
|
||||||
|
a,h1, h2, h3, h4, h5, h6{ color: #333333;}
|
||||||
|
a:hover{ color: #FF9900;}
|
||||||
|
.text-red{ color: red;}
|
||||||
|
.text-muted{ color: #999999;}
|
||||||
|
|
||||||
|
/* form */
|
||||||
|
.form-control{ background-color: #F5F5F5; color: #999999; border: 1px solid #EEEEEE;}
|
||||||
|
.form-control.colorfff{ background-color: #FFFFFF;}
|
||||||
|
.form-control:focus{border-color:#FF9900; -webkit-box-shadow:inset 0 1px 1px rgba(255,136,0,.075),0 0 8px rgba(255,136,0,.6);}
|
||||||
|
|
||||||
|
/* btn */
|
||||||
|
.btn,.btn:hover,.btn .icon{ color: #333333;}
|
||||||
|
.btn{ border: 1px solid #EEEEEE;}
|
||||||
|
.btn-default{ background-color: #f5f5f5; color: #333333;}
|
||||||
|
.btn-default:hover{ background-color: #f0eeee;}
|
||||||
|
.btn-primary{ background-color: #FF9900; border: 1px solid #FF9900; color: #FFFFFF;}
|
||||||
|
.btn-primary .icon{ color: #FFFFFF;}
|
||||||
|
.btn-primary:hover{ background-color: #FF6600; border: 1px solid #FF6600; color: #FFFFFF;}
|
||||||
|
.btn-primary:hover .icon{ color: #FFFFFF;}
|
||||||
|
|
||||||
|
/* dropdown */
|
||||||
|
.dropdown-menu{ background-color: #FFFFFF; border: 1px solid #EEEEEE;}
|
||||||
|
.dropdown-menu:before{background-color: #FFFFFF; border-color: #EEEEEE;}
|
||||||
|
.dropdown-menu>.active>a, .dropdown-menu>.active>a:focus, .dropdown-menu>.active>a:hover{ background-color: #FF9900; color: #FFFFFF;}
|
||||||
|
|
||||||
|
/* line */
|
||||||
|
.split-line{ background-color: #EEEEEE;}
|
||||||
|
.top-line:before{ border-top: 1px solid #EEEEEE;}
|
||||||
|
.bottom-line:after{ border-bottom: 1px solid #EEEEEE;}
|
||||||
|
.top-line-dot:before{ border-top: 1px dotted #EEEEEE;}
|
||||||
|
.bottom-line-dot:before{ border-bottom: 1px dotted #EEEEEE;}
|
||||||
|
|
||||||
|
/* badge */
|
||||||
|
.badge{ background-color: #EEEEEE;}
|
||||||
|
.badge-first{ background-color: #FF4A4A; color: #FFFFFF;}
|
||||||
|
.badge-second{ background-color: #FF7701; color: #FFFFFF;}
|
||||||
|
.badge-third{ background-color: #FFB400; color: #FFFFFF;}
|
||||||
|
|
||||||
|
/* nav */
|
||||||
|
.nav-head > li.active > a,.nav-tabs > li.active > a{ border-bottom: 2px solid #FF9900; color: #FF9900;}
|
||||||
|
.nav-tag > li > a,.nav-page > li > a{ background-color: #FFFFFF; border: 1px solid #EEEEEE; color: #333333;}
|
||||||
|
.nav-tag > li > a:hover,.nav-tag > li.active a,.nav-page > li > a:hover,.nav-page > li.active > a{ background-color: #FF9900; border: 1px solid #FF9900; color: #FFFFFF;}
|
||||||
|
.nav-page > li > a:hover > .icon{ color: #fff;}
|
||||||
|
|
||||||
|
/* tag */
|
||||||
|
.tag-type li a{ background-color: #FFFFFF; border: 1px solid #EEEEEE; color: #666666;}
|
||||||
|
.tag-type li a:hover,.tag-type li.active a{ background-color: #FF9900; border: 1px solid #FF9900; color: #FFFFFF;}
|
||||||
|
.tag-btn li a{ background-color: #F8F8F8; color: #666666;}
|
||||||
|
.tag-btn li a.active,.tag-text li a.active,.tag-type li a.active{ color: #FF9900;}
|
||||||
|
.tag-btn li a:hover,.tag li.active a{ background-color: #FF9900; color: #FFFFFF;}
|
||||||
|
|
||||||
|
/* pic-tag */
|
||||||
|
.pic-tag{ background-color: rgba(0,0,0,0.6); color: #FFFFFF;}
|
||||||
|
.pic-tag.active,.pic-tag-h{ background-color: #FF9900; color: #FFFFFF;}
|
||||||
|
.pic-text,.pic-title-b{ background-repeat: no-repeat; background-image: linear-gradient(transparent,rgba(0,0,0,.5)); color: #FFFFFF;}
|
||||||
|
.pic-text.active{ background: rgba(0,0,0,0.6); color: #FFFFFF;}
|
||||||
|
.pic-title-t{background: linear-gradient(to bottom, rgba(0,0,0,0.7) 0%,rgba(0,0,0,0) 100%); color: #FFFFFF;}
|
||||||
|
|
||||||
|
/* pannel */
|
||||||
|
.stui-pannel-bg{background-color: #FFFFFF; border: 1px solid #EEEEEE;}
|
||||||
|
|
||||||
|
/* tabbar */
|
||||||
|
.stui_nav__taddar .item .icon,.stui_nav__taddar .item .title{ color: #999;}
|
||||||
|
.stui_nav__taddar .item.active .title,.stui_nav__taddar .item.active .icon{color: #FF9900;}
|
||||||
|
.stui_nav__taddar.fixed{ background-color: #FFFFFF;}
|
||||||
|
|
||||||
|
/* vodlist */
|
||||||
|
.stui-vodlist__bg{background-color: #FFFFFF; box-shadow: 0 1px 2px rgba(0,0,0,.05);}
|
||||||
|
.stui-vodlist__bg:hover{ box-shadow: 0 3px 5px rgba(0,0,0,.08);}
|
||||||
|
|
||||||
|
/* text-list */
|
||||||
|
.stui-vodlist__text.striped .striped-head,.stui-vodlist__text.to-color li:nth-of-type(odd){ background-color: #f5f5f5;}
|
||||||
|
|
||||||
|
/* link */
|
||||||
|
.stui-link__pic li a{ background-color: #FFFFFF; border: 1px solid #F5F5F5;}
|
||||||
|
.stui-link__pic li a:hover{ border: 1px solid #FF9900;}
|
||||||
|
|
||||||
|
/* screen */
|
||||||
|
.stui-screen__list li a{ color: #333333;}
|
||||||
|
.stui-screen__list li.active a{ background-color: #FF9900; color: #FFFFFF;}
|
||||||
|
|
||||||
|
/* playlist */
|
||||||
|
.stui-content__playlist li a{ border: 1px solid #EEEEEE;}
|
||||||
|
.stui-content__playlist li a:hover,.stui-content__playlist li.active a{ border: 1px solid #FF9900; background-color: #FF9900; color: #FFFFFF;}
|
||||||
|
|
||||||
|
/* player */
|
||||||
|
.stui-player__video{ background-color: #000000;}
|
||||||
|
|
||||||
|
/* page */
|
||||||
|
.stui-page li a,.stui-page li .num,.stui-page-text a,.stui-page-text em,.stui-page-text span{background-color: #FFFFFF; border: 1px solid #EEEEEE;}
|
||||||
|
.stui-page li a:hover,.stui-page li.active a,.stui-page li.active .num,.stui-page li.disabled a,.stui-page-text span.pagenow{ background-color: #FF9900; color: #FFFFFF; border: 1px solid #FF9900;}
|
||||||
|
.stui-page-text .pagego{ border: 1px solid #EEEEEE;}
|
||||||
|
.stui-page-text .pagebtn{background-color: #FFFFFF; border: 1px solid #EEEEEE;}
|
||||||
|
|
||||||
|
/* extra */
|
||||||
|
.stui-extra li a,.stui-extra li span{ background-color: #FFFFFF; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);}
|
||||||
|
.stui-extra li a.backtop{ background-color: rgba(0,0,0,0.6); color: #FFFFFF; }
|
||||||
|
.stui-extra li .sideslip{ background-color: #FFFFFF; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);}
|
||||||
|
.stui-extra li .sideslip:before{ background-color: #FFFFFF; border-color: rgba(0, 0, 0, 0.1);}
|
||||||
|
|
||||||
|
/* popup */
|
||||||
|
.popup{ background-color: #F8F8F8;}
|
||||||
|
.popup-head{ background-color: #FFFFFF;}
|
||||||
|
|
||||||
|
.maskkkk {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
left:0px;
|
||||||
|
width: 100%;
|
||||||
|
height: 128px;
|
||||||
|
z-index: 1001;
|
||||||
|
|
||||||
|
}
|
||||||
|
.closeee{
|
||||||
|
background: url("images/closesanjiao.png") no-repeat center center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.maskkkk .gotoCenter {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 140px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
.maskkkk .closeee {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 20px;
|
||||||
|
margin-left: 0px;
|
||||||
|
width: 40px;
|
||||||
|
height: 100%;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.clickarea{
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 200px;
|
||||||
|
margin-left: 0px;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.thumbnail {
|
||||||
|
position: fixed;
|
||||||
|
right: 0px;
|
||||||
|
bottom: 0px;
|
||||||
|
width: 184px;
|
||||||
|
height: 124px;
|
||||||
|
cursor: pointer;
|
||||||
|
/*display: none;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
.fd_gb
|
||||||
|
{ width:20px; height:20px; margin:10px 0 0 0; position:absolute; right:0; top:0;}
|
||||||
|
|
||||||
|
|
||||||
|
@-webkit-keyframes rotate {
|
||||||
|
from {-webkit-transform:rotate(0deg);}
|
||||||
|
to {-webkit-transform:rotate(360deg);}
|
||||||
|
}
|
||||||
|
@media (max-width: 767px){
|
||||||
|
|
||||||
|
/* form */
|
||||||
|
.form-control{ background-color:#F8F8F8; color: #999999; border: 0;}
|
||||||
|
|
||||||
|
/*pannel*/
|
||||||
|
.stui-pannel-bg,.stui-vodlist__bg,.stui-vodlist__bg:hover{box-shadow: none;border: 0;}
|
||||||
|
|
||||||
|
/* line */
|
||||||
|
.m-top-line:before{ border-top: 1px solid #EEEEEE;}
|
||||||
|
.m-bottom-line:after{ border-bottom: 1px solid #EEEEEE;}
|
||||||
|
.m-top-line-dot:before{ border-top: 1px dotted #EEEEEE;}
|
||||||
|
.m-bottom-line-dot:before{ border-bottom: 1px dotted #EEEEEE;}
|
||||||
|
}
|
||||||
170
resources/assets/css/stui_default.css
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
@charset "utf-8";
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
.stui-header__top{position: relative; margin-bottom: 20px; background-color: #fff;}
|
||||||
|
|
||||||
|
/* header-logo */
|
||||||
|
.stui-header__logo{float:left;}
|
||||||
|
.stui-header__logo{margin: 20px 0;}
|
||||||
|
|
||||||
|
/* header-menu */
|
||||||
|
.stui-header__menu{position:relative; background-color: #333; color: #fff;}
|
||||||
|
.stui-header__menu li{float:left;}
|
||||||
|
.stui-header__menu li a{display:inline-block; padding: 15px 25px; font-size:15px; color: #fff;}
|
||||||
|
.stui-header__menu li.active a, .stui-header__menu li:hover{ background-color: #222;}
|
||||||
|
.stui-header__menu .more{ position: absolute; top: 0; right: 0; padding: 15px 0; color: #999;}
|
||||||
|
|
||||||
|
.stui-header__menu .submenu {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
left: -100%;
|
||||||
|
background-color: #222;
|
||||||
|
z-index: 10;
|
||||||
|
width: 50vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stui-header__menu .submenu li {
|
||||||
|
width: 20%;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stui-header__menu .submenu li a{
|
||||||
|
padding: 4px 6px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stui-header__menu li.dropdown:hover .submenu{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* header-seacrh */
|
||||||
|
.stui-header__search{ float:left; position:relative; width: 380px; margin: 25px 30px 25px 50px; }
|
||||||
|
.stui-header__search .form-control{display:block; width:100%; height: 38px; padding: 0 45px 0 10px; font-size:12px; line-height: 25px; border-radius: 5px; transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s; background-color:#f5f5f5; color: #999; border: 0;}
|
||||||
|
.stui-header__search .submit{display:block; position:absolute; top: 0; right: 0; width:35px; height: 38px; border: 0; cursor: pointer; border: 0; background: none; color: #999;}
|
||||||
|
|
||||||
|
/* header-user */
|
||||||
|
.stui-header__user{float:right}
|
||||||
|
.stui-header__user > li{ float:left; position: relative; padding: 35px 0 10px; margin-left: 30px}
|
||||||
|
.stui-header__user > li .icon{ font-size: 24px; line-height: 24px; vertical-align: -2px; color: #999;}
|
||||||
|
.stui-header__user > li .dropdown{ display: none; position: absolute; z-index: 999; width: 240px; top: 100%; right: -15px; padding: 15px; font-size: 12px; color: #999; background-color: #fff; box-shadow: 0 2px 8px rgba(0,0,0,.2); border-radius: 4px; background-color: #fff; box-shadow: 0 2px 8px rgba(0,0,0,.2);}
|
||||||
|
.stui-header__user > li .dropdown:before{ content:" "; width:10px; height:10px; -webkit-transform:rotate(-45deg); -ms-transform:rotate(-45deg); transform:rotate(-45deg); position: absolute; top:-5px; right: 30px; background-color: #fff; border-top: 1px solid #eee; border-right: 1px solid #eee;}
|
||||||
|
.stui-header__user > li:hover .dropdown{ display: block;}
|
||||||
|
.stui-header__user .dropdown li{ position: relative; padding: 10px 0;}
|
||||||
|
.stui-header__user .dropdown li:first-child{ margin-top: 10px;}
|
||||||
|
.stui-header__user .dropdown li:last-child{ padding-bottom: 0;}
|
||||||
|
|
||||||
|
/* media */
|
||||||
|
.stui-vodlist__media li .score{ position: relative;}
|
||||||
|
.stui-vodlist__media li .score .star{zoom: 50%; display: inline-block; position: relative; top: 5px; width: 160px; height: 25px; background: url(/themes/xingkong/img/star1.png) 0 0 no-repeat;}
|
||||||
|
.stui-vodlist__media li .score .branch{ display: inline-block; font-size: 12px; color: red;}
|
||||||
|
.stui-vodlist__media li .score .star .star-cur{display: inline-block; background: url(/themes/xingkong/img/star.png) 0 0 no-repeat; height: 25px; position: absolute; top: 0; z-index: 1;}
|
||||||
|
|
||||||
|
/* content */
|
||||||
|
.stui-content__detail,.stui-content__thumb{display:table-cell;vertical-align:top}
|
||||||
|
.stui-content__thumb .v-thumb{width:190px}
|
||||||
|
.stui-content__thumb .w-thumb{width:300px}
|
||||||
|
.stui-content__detail{width:100%;padding:10px 20px;}
|
||||||
|
.stui-content__detail .title{margin: 0 0 10px; font-size: 24px; line-height:30px; font-weight: 700;}
|
||||||
|
.stui-content__detail .data{margin-bottom:10px}
|
||||||
|
.stui-content__detail .data li{float:left;margin-right:20px}
|
||||||
|
.stui-content__detail .desc{padding-left:42px}
|
||||||
|
.stui-content__detail .desc .left{margin-left:-42px}
|
||||||
|
/* .stui-content__detail .play-btn{padding-left:65px;margin-top:20px} */
|
||||||
|
.stui-content__detail .play-btn .share{margin-top:5px}
|
||||||
|
.stui-content__detail .play-btn .btn{ margin-right: 10px;}
|
||||||
|
.stui-content h2 {font-size: 14px;line-height: 14px;}
|
||||||
|
/* player */
|
||||||
|
.stui-player__video{ background-color: #000}
|
||||||
|
.stui-player__detail{ margin-top: 20px;}
|
||||||
|
.stui-player__detail .more-btn{ float: right; padding-top: 10px;}
|
||||||
|
.stui-player__detail .more-btn li{ display: inline-block; margin-left: 10px;}
|
||||||
|
.stui-player__detail .more-btn .btn{ padding: 6px 15px;}
|
||||||
|
.stui-player__detail .title{margin:0 0 10px}
|
||||||
|
.stui-player__detail .detail-content{padding-top:10px}
|
||||||
|
.stui-player__detail .desc{padding-left:42px}
|
||||||
|
.stui-player__detail .desc .left{margin-left:-42px}
|
||||||
|
|
||||||
|
/* autocomplete */
|
||||||
|
.autocomplete-suggestions{ padding: 0 10px; margin-top: 5px; border-radius:4px; background-color: #FFFFFF; box-shadow: 0 2px 10px rgba(0,0,0,.05);}
|
||||||
|
.autocomplete-suggestions.active{position: absolute; z-index: 9999; top: 100%; width: 100%;}
|
||||||
|
.autocomplete-suggestion{padding:10px 0; cursor:pointer; border-top: 1px solid #EEEEEE;}
|
||||||
|
.autocomplete-suggestion:first-child{border-top:0}
|
||||||
|
.mac_results{ z-index: 9999; padding: 0 10px; margin-top: 5px; border-radius:4px; background-color: #FFFFFF; border:1px solid #EEEEEE; box-shadow: 0 2px 10px rgba(0,0,0,.05);}
|
||||||
|
.mac_results li{padding:10px 0; cursor:pointer; border-top: 1px solid #EEEEEE;}
|
||||||
|
.mac_results li:first-child{ border: 0;}
|
||||||
|
|
||||||
|
|
||||||
|
@media (min-width:768px){
|
||||||
|
.container{width:750px}
|
||||||
|
}
|
||||||
|
@media (min-width:992px){
|
||||||
|
.container{width:920px}
|
||||||
|
}
|
||||||
|
@media (min-width:1200px){
|
||||||
|
.container{width:1170px}
|
||||||
|
}
|
||||||
|
@media (max-width:1024px){
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
.stui-header__top{ margin-bottom: 10px;}
|
||||||
|
.stui-header__logo{margin:10px 0 10px}
|
||||||
|
.stui-header__search{ margin: 10px 0 10px 30px; width: 200px;}
|
||||||
|
.stui-header__search .form-control{ height: 30px;}
|
||||||
|
.stui-header__search .submit{ width: 30px; height: 30px;}
|
||||||
|
/* .stui-header__menu ul{ overflow:hidden; white-space: nowrap;} */
|
||||||
|
.stui-header__menu li{ float: none; display: inline-block;}
|
||||||
|
.stui-header__menu li a{ padding: 12px 15px; font-size: 14px; white-space:nowrap;}
|
||||||
|
.stui-header__user > li{ padding: 15px 0 10px; margin-right: 10px;}
|
||||||
|
.stui-header__user > li .dropdown{ right: 0;}
|
||||||
|
.stui-header__user > li .icon{ font-size: 18px; line-height: 18px;}
|
||||||
|
.stui-header__menu li:hover .dropdown,.stui-header__user > li:hover .dropdown{ display: none;}
|
||||||
|
|
||||||
|
.stui-header__menu .submenu {
|
||||||
|
left: 0;
|
||||||
|
max-width: 75vw;
|
||||||
|
max-height: 50vh;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
.stui-header__menu .submenu li {
|
||||||
|
width: 100%;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width:767px){
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
.stui-header__logo{ margin-left:10px}
|
||||||
|
.stui-header__search{ margin: 0; position:absolute; top: 15px; left: 170px; right:30px; width:auto;}
|
||||||
|
.stui-header__user{padding-right:10px}
|
||||||
|
.stui-header__user > li{ padding: 14px 0; margin: 0;}
|
||||||
|
.stui-header__user > li .dropdown:before{ right: 8px;}
|
||||||
|
.stui-header__user > li .icon{ font-size: 24px; line-height: 24px;}
|
||||||
|
|
||||||
|
/* content */
|
||||||
|
.stui-content__thumb .v-thumb{width:115px}
|
||||||
|
.stui-content__thumb .w-thumb{width:160px}
|
||||||
|
.stui-content__detail{padding:0 10px}
|
||||||
|
.stui-content__detail .title{ margin:0 0 8px; font-size:18px; line-height:18px; font-weight: 700;}
|
||||||
|
.stui-content__detail .data{margin:0 0 8px;font-size:12px}
|
||||||
|
.stui-content__detail .play-btn{margin:0;padding:0}
|
||||||
|
|
||||||
|
/* player */
|
||||||
|
.stui-player__detail.detail .title{ margin-top: 10px; font-size: 16px;}
|
||||||
|
.stui-player__detail{ margin-top: 0;}
|
||||||
|
.stui-player__detail .title{ font-size:18px; font-weight: 700;}
|
||||||
|
.stui-player__detail .more-btn{ margin-bottom: 10px;}
|
||||||
|
.stui-player__detail .more-btn{ float: none; padding: 10px; background-color: #222; display: -webkit-box; display: -webkit-flex; display: flex;}
|
||||||
|
.stui-player__detail .more-btn li{ margin: 0; padding: 0 5px; -webkit-box-flex: 1; -webkit-flex: 1; flex: 1; text-align: center;}
|
||||||
|
.stui-player__detail .more-btn .btn{ display: block; padding: 6px;}
|
||||||
|
|
||||||
|
/* type */
|
||||||
|
.stui-mobile__type li{padding:0 20px}
|
||||||
|
.stui-mobile__type li a{display:block;padding:10px 0;text-align:center}
|
||||||
|
|
||||||
|
/* foot */
|
||||||
|
.stui-foot{padding:20px 0}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.text_single-line {display: inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;-o-text-overflow: ellipsis;max-width: 140px;}
|
||||||
BIN
resources/assets/img/bg_icon.jpg
Normal file
|
After Width: | Height: | Size: 519 B |
BIN
resources/assets/img/icon_1.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
resources/assets/img/icon_30.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
resources/assets/img/icon_6.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
resources/assets/img/load.gif
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
resources/assets/img/load_f.gif
Normal file
|
After Width: | Height: | Size: 9.3 KiB |
BIN
resources/assets/img/load_w.gif
Normal file
|
After Width: | Height: | Size: 9.3 KiB |
BIN
resources/assets/img/play.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
resources/assets/img/star.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
resources/assets/img/star1.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
0
resources/assets/js/index.html
Normal file
2
resources/assets/js/jquery.min.js
vendored
Normal file
319
resources/assets/js/stui_block.js
Normal file
@ -0,0 +1,319 @@
|
|||||||
|
/*!
|
||||||
|
* v3.0 Copyright 2016-2018 http://v.shoutu.cn
|
||||||
|
* Email 726662013@qq.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
var playerhigh = "1";
|
||||||
|
//是否开启播放器高度自适应,0关闭1开启(开启后将播放器设置100%关闭填写固定高度)
|
||||||
|
|
||||||
|
var lazyswitch = "1";
|
||||||
|
//是否开启图片懒加载,0关闭1开启(关闭后会通过js直接加载图片,速度较慢)
|
||||||
|
|
||||||
|
var playcolumn = "8";
|
||||||
|
//是否开启有序播放列表,0关闭,3、6、8、10、12开启并指定列数,数字代表每行列数,手机强制4列
|
||||||
|
|
||||||
|
var qrcode1 = "1";
|
||||||
|
//右侧悬浮二维码,1自动生成(当前页面二维码),填写路径将加载指定图片(建议尺寸150*150px)例:/statics/img/wxcode.png
|
||||||
|
|
||||||
|
var qrcode2 = "1";
|
||||||
|
//内容页二维码,1自动生成(当前页面二维码),填写路径将加载指定图片(建议尺寸160*160px)例:/statics/img/wxcode.png
|
||||||
|
|
||||||
|
var copyshort = "0"
|
||||||
|
//是否开启自动生成短链接,0关闭1开启(开启后点击分享按钮将会复制短链否则复制默认链接)
|
||||||
|
|
||||||
|
var baidushare = "0";
|
||||||
|
//是否开启百度分享,0关闭,启用本地分享填写/statics/api/js/share.js,启用官网分享填写http://bdimg.share.baidu.com/static/api/js/share.js(不支持https)
|
||||||
|
|
||||||
|
var stui = {
|
||||||
|
'browser': {//浏览器
|
||||||
|
url: document.URL,
|
||||||
|
domain: document.domain,
|
||||||
|
title: document.title,
|
||||||
|
language: (navigator.browserLanguage || navigator.language).toLowerCase(),
|
||||||
|
canvas: function() {
|
||||||
|
return !!document.createElement("canvas").getContext
|
||||||
|
}(),
|
||||||
|
useragent: function() {
|
||||||
|
var a = navigator.userAgent;
|
||||||
|
return {
|
||||||
|
mobile: !! a.match(/AppleWebKit.*Mobile.*/),
|
||||||
|
ios: !! a.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
|
||||||
|
android: -1 < a.indexOf("Android") || -1 < a.indexOf("Linux"),
|
||||||
|
iPhone: -1 < a.indexOf("iPhone") || -1 < a.indexOf("Mac"),
|
||||||
|
iPad: -1 < a.indexOf("iPad"),
|
||||||
|
trident: -1 < a.indexOf("Trident"),
|
||||||
|
presto: -1 < a.indexOf("Presto"),
|
||||||
|
webKit: -1 < a.indexOf("AppleWebKit"),
|
||||||
|
gecko: -1 < a.indexOf("Gecko") && -1 == a.indexOf("KHTML"),
|
||||||
|
weixin: -1 < a.indexOf("MicroMessenger")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
},
|
||||||
|
'mobile': {//移动端
|
||||||
|
'popup': function() {
|
||||||
|
$popblock = $(".popup");
|
||||||
|
$(".open-popup").click(function() {
|
||||||
|
$popblock.addClass("popup-visible");
|
||||||
|
$("body").append('<div class="mask"></div>');
|
||||||
|
$(".close-popup").click(function() {
|
||||||
|
$popblock.removeClass("popup-visible");
|
||||||
|
$(".mask").remove();
|
||||||
|
$("body").removeClass("modal-open");
|
||||||
|
});
|
||||||
|
$(".mask").click(function() {
|
||||||
|
$popblock.removeClass("popup-visible");
|
||||||
|
$(this).remove();
|
||||||
|
$("body").removeClass("modal-open");
|
||||||
|
});
|
||||||
|
})
|
||||||
|
},
|
||||||
|
'slide': function() {
|
||||||
|
$(".type-slide").each(function(a) {
|
||||||
|
$index = $(this).find('.active').index()*1;
|
||||||
|
if($index > 3){
|
||||||
|
$index = $index-3;
|
||||||
|
}else{
|
||||||
|
$index = 0;
|
||||||
|
}
|
||||||
|
$(this).flickity({
|
||||||
|
cellAlign: 'left',
|
||||||
|
freeScroll: true,
|
||||||
|
contain: true,
|
||||||
|
prevNextButtons: false,
|
||||||
|
pageDots: false,
|
||||||
|
initialIndex: $index
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'mshare': function() {
|
||||||
|
$(".open-share").click(function() {
|
||||||
|
stui.browser.useragent.weixin ? $("body").append('<div class="mobile-share share-weixin"></div>') : $("body").append('<div class="mobile-share share-other"></div>');
|
||||||
|
$(".mobile-share").click(function() {
|
||||||
|
$(".mobile-share").remove();
|
||||||
|
$("body").removeClass("modal-open");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'images': {//图片处理
|
||||||
|
'lazyload': function() {
|
||||||
|
if(lazyswitch==1){
|
||||||
|
$(".lazyload").lazyload({
|
||||||
|
effect: "fadeIn",
|
||||||
|
threshold: 200,
|
||||||
|
failurelimit: 15,
|
||||||
|
skip_invisible: false
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
$(".lazyload").each(function(){
|
||||||
|
var original = $(this).attr("data-original");
|
||||||
|
$(this).css("background-image","url("+original+")");
|
||||||
|
$(this).attr("data-original","");
|
||||||
|
if($(this).attr("src")!= undefined){
|
||||||
|
$(this).attr("src",original);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'carousel': function() {
|
||||||
|
$('.carousel_default').flickity({
|
||||||
|
cellAlign: 'left',
|
||||||
|
contain: true,
|
||||||
|
wrapAround: true,
|
||||||
|
autoPlay: true,
|
||||||
|
prevNextButtons: false
|
||||||
|
});
|
||||||
|
$('.carousel_wide').flickity({
|
||||||
|
cellAlign: 'center',
|
||||||
|
contain: true,
|
||||||
|
wrapAround: true,
|
||||||
|
autoPlay: true
|
||||||
|
});
|
||||||
|
$('.carousel_center').flickity({
|
||||||
|
cellAlign: 'center',
|
||||||
|
contain: true,
|
||||||
|
wrapAround: true,
|
||||||
|
autoPlay: true,
|
||||||
|
prevNextButtons: false
|
||||||
|
});
|
||||||
|
$('.carousel_right').flickity({
|
||||||
|
cellAlign: 'left',
|
||||||
|
wrapAround: true,
|
||||||
|
contain: true,
|
||||||
|
pageDots: false
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
'qrcode': function() {
|
||||||
|
if(qrcode1==1){
|
||||||
|
if($("#qrcode").length){
|
||||||
|
var qrcode = new QRCode('qrcode', {
|
||||||
|
text: stui.browser.url,
|
||||||
|
width: 150,
|
||||||
|
height: 150,
|
||||||
|
colorDark : '#000000',
|
||||||
|
colorLight : '#ffffff',
|
||||||
|
correctLevel : QRCode.CorrectLevel.H
|
||||||
|
});
|
||||||
|
$("#qrcode img").attr("class","img-responsive");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if($("#qrcode").length){
|
||||||
|
$("#qrcode").append("<img class='img-responsive' src='"+qrcode1+"' width='150' height='150' />");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(qrcode2==1){
|
||||||
|
if($("#qrcode2").length){
|
||||||
|
var qrcode = new QRCode('qrcode2', {
|
||||||
|
text: stui.browser.url,
|
||||||
|
width: 160,
|
||||||
|
height: 160,
|
||||||
|
colorDark : '#000000',
|
||||||
|
colorLight : '#ffffff',
|
||||||
|
correctLevel : QRCode.CorrectLevel.H
|
||||||
|
});
|
||||||
|
$("#qrcode2 img").attr("class","img-responsive").css({"padding":"10px","background-color":"#fff"});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if($("#qrcode2").length){
|
||||||
|
$("#qrcode2").append("<img class='img-responsive' src='"+qrcode2+"' width='160' height='160' />");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
'common': {//公共基础
|
||||||
|
'bootstrap': function() {
|
||||||
|
$('a[data-toggle="tab"]').on("shown.bs.tab", function(a) {
|
||||||
|
var b = $(a.target).text();
|
||||||
|
$(a.relatedTarget).text();
|
||||||
|
$("span.active-tab").html(b);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'headroom': function() {
|
||||||
|
if($("#header-top").length){
|
||||||
|
var header = document.querySelector("#header-top");
|
||||||
|
var headroom = new Headroom(header, {
|
||||||
|
tolerance: 5,
|
||||||
|
offset: 205,
|
||||||
|
classes: {
|
||||||
|
initial: "top-fixed",
|
||||||
|
pinned: "top-fixed-up",
|
||||||
|
unpinned: "top-fixed-down"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
headroom.init();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'history': function() {
|
||||||
|
if($("#stui_history").length){
|
||||||
|
if($.cookie("recente")){
|
||||||
|
var json=eval("("+$.cookie("recente")+")");
|
||||||
|
var list="";
|
||||||
|
for(i=0;i<json.length;i++){
|
||||||
|
list = list + "<li class='top-line'><a href='"+json[i].vod_url+"' title='"+json[i].vod_name+"'><span class='pull-right text-red'>"+json[i].vod_part+"</span>"+json[i].vod_name+"</a></li>";
|
||||||
|
}
|
||||||
|
$("#stui_history").append(list);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
$("#stui_history").append("<p style='padding: 80px 0; text-align: center'>您还没有看过影片哦</p>");
|
||||||
|
|
||||||
|
$(".historyclean").on("click",function(){
|
||||||
|
$.cookie("recente",null,{expires:-1,path: '/'});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'collapse': function() {
|
||||||
|
if($(".detail").length){
|
||||||
|
$(".detail").find("a.detail-more").on("click",function(){
|
||||||
|
$(this).parent().find(".detail-sketch").addClass("hide");
|
||||||
|
$(this).parent().find(".detail-content").css("display","");
|
||||||
|
$(this).remove();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'scrolltop': function() {
|
||||||
|
var a = $(window);
|
||||||
|
$scrollTopLink = $("a.backtop");
|
||||||
|
a.scroll(function() {
|
||||||
|
500 < $(this).scrollTop() ? $scrollTopLink.css("display", "") : $scrollTopLink.css("display", "none");
|
||||||
|
});
|
||||||
|
$scrollTopLink.on("click", function() {
|
||||||
|
$("html, body").animate({
|
||||||
|
scrollTop: 0
|
||||||
|
}, 400);
|
||||||
|
return !1
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'copylink': function(){
|
||||||
|
if(copyshort==1){
|
||||||
|
if($(".copylink").length){
|
||||||
|
$.ajax({
|
||||||
|
type : 'GET',
|
||||||
|
url : 'https://api.weibo.com/2/short_url/shorten.json?source=2849184197&url_long='+encodeURIComponent(stui.browser.url),
|
||||||
|
dataType : 'JSONP',
|
||||||
|
success : function(r) {
|
||||||
|
url_short = r.data.urls[0].url_short;
|
||||||
|
var clipboard = new Clipboard('.copylink', {
|
||||||
|
text: function() {
|
||||||
|
return url_short;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
clipboard.on('success', function(e) {
|
||||||
|
alert("地址复制成功,赶快分享给小伙伴吧!");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if($(".copylink").length){
|
||||||
|
var url_short = stui.browser.url;
|
||||||
|
var clipboard = new Clipboard('.copylink', {
|
||||||
|
text: function() {
|
||||||
|
return url_short;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
clipboard.on('success', function(e) {
|
||||||
|
alert("地址复制成功,赶快分享给小伙伴吧!");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
'share': function(){
|
||||||
|
if(baidushare!=0){
|
||||||
|
$(".share").html('<span class="bds_shere"></span><a class="bds_qzone" data-cmd="qzone" title="分享到QQ空间"></a><a class="bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a><a class="bds_weixin" data-cmd="weixin" title="分享到微信"></a><a class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博"></a><a class="bds_sqq" data-cmd="sqq" title="分享到QQ好友"></a><a class="bds_bdhome" data-cmd="bdhome" title="分享到百度新首页"></a><a class="bds_tqf" data-cmd="tqf" title="分享到腾讯朋友"></a><a class="bds_youdao" data-cmd="youdao" title="分享到有道云笔记"></a><a class="bds_more" data-cmd="more" title="更多"></a>');
|
||||||
|
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"24"},"share":{}};with(document)0[(getElementsByTagName("head")[0]||body).appendChild(createElement('script')).src=''+baidushare+'?cdnversion='+~(-new Date()/36e5)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* if(window.console&&window.console.log){
|
||||||
|
console.log('\u9996\u6d82\u7f51\uff08v.shoutu.cn\uff09\u539f\u521b\u4f5c\u54c1');
|
||||||
|
console.log('\u4f5c\u8005\uff1a\u5c0f\u4e8c\u54e5\uff0cQQ\uff1a726662013');
|
||||||
|
console.log("%c\u539f\u521b\u4f5c\u54c1\u8bf7\u5c0a\u91cd\u4f5c\u8005\u52b3\u52a8\u6210\u679c\uff0c\u52ff\u5012\u5356\u5206\u4eab\uff0c\u8c22\u8c22\uff01","color:red");
|
||||||
|
}*/
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
if(stui.browser.useragent.mobile){
|
||||||
|
stui.mobile.slide();
|
||||||
|
stui.mobile.popup();
|
||||||
|
stui.mobile.mshare();
|
||||||
|
}
|
||||||
|
stui.images.lazyload();
|
||||||
|
stui.images.carousel();
|
||||||
|
stui.images.qrcode();
|
||||||
|
stui.common.bootstrap();
|
||||||
|
stui.common.headroom();
|
||||||
|
stui.common.history();
|
||||||
|
stui.common.collapse();
|
||||||
|
stui.common.scrolltop();
|
||||||
|
stui.common.copylink();
|
||||||
|
stui.common.share();
|
||||||
|
});
|
||||||
90
resources/assets/js/stui_default.js
Normal file
BIN
resources/assets/player/1s_blank.mp4
Normal file
1
resources/assets/player/js/p2p-media-loader-core.min.js
vendored
Normal file
28
resources/assets/player/js/p2p-media-loader-hlsjs.min.js
vendored
Normal file
BIN
resources/assets/plugins/jquery-raty/fonts/raty.eot
Normal file
15
resources/assets/plugins/jquery-raty/fonts/raty.svg
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata>Generated by IcoMoon</metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="raty" horiz-adv-x="512">
|
||||||
|
<font-face units-per-em="512" ascent="480" descent="-32" />
|
||||||
|
<missing-glyph horiz-adv-x="512" />
|
||||||
|
<glyph unicode=" " d="" horiz-adv-x="256" />
|
||||||
|
<glyph unicode="" d="M256 16c-114.88 0-208 93.12-208 208s93.12 208 208 208 208-93.12 208-208-93.12-208-208-208zM351.376 284.656c3.904 3.904 3.904 10.256 0 14.16l-21.248 21.232c-3.904 3.904-10.256 3.904-14.16 0l-60.176-60.176-60.176 60.176c-3.904 3.904-10.256 3.904-14.16 0l-21.248-21.232c-3.904-3.904-3.904-10.256 0-14.16l60.192-60.192-60.192-60.16c-3.904-3.904-3.904-10.256 0-14.16l21.248-21.248c3.904-3.904 10.256-3.904 14.16 0l60.176 60.192 60.176-60.192c3.904-3.904 10.256-3.904 14.16 0l21.248 21.248c3.904 3.904 3.904 10.256 0 14.16l-60.192 60.16 60.192 60.192z" />
|
||||||
|
<glyph unicode="" d="M256 16c-114.88 0-208 93.12-208 208s93.12 208 208 208 208-93.12 208-208-93.12-208-208-208zM256 384c-88.352 0-160-71.648-160-160s71.648-160 160-160c88.368 0 160 71.648 160 160s-71.632 160-160 160zM328.592 167.44l-16.224-16.224c-2.976-2.976-7.808-2.976-10.8 0l-45.92 45.92-45.92-45.92c-2.992-2.976-7.808-2.976-10.8 0l-16.224 16.224c-2.976 2.976-2.976 7.808 0 10.8l45.936 45.904-45.936 45.92c-2.976 2.992-2.976 7.824 0 10.816l16.224 16.208c2.992 2.992 7.808 2.992 10.8 0l45.92-45.92 45.92 45.92c2.992 2.992 7.824 2.992 10.8 0l16.224-16.208c2.976-2.992 2.976-7.824 0-10.816l-45.936-45.92 45.936-45.904c2.976-2.992 2.976-7.84 0-10.8z" />
|
||||||
|
<glyph unicode="" d="M475.428 290.572q0-6.286-7.428-13.714l-103.714-101.143 24.572-142.857q0.286-2 0.286-5.714 0-6-3-10.143t-8.714-4.143q-5.428 0-11.428 3.428l-128.286 67.428-128.286-67.428q-6.285-3.428-11.428-3.428-6 0-9 4.143t-3 10.143q0 1.714 0.572 5.714l24.572 142.857-104 101.143q-7.143 7.714-7.143 13.714 0 10.572 16 13.143l143.428 20.857 64.286 130q5.428 11.714 14 11.714t14-11.714l64.286-130 143.429-20.857q16-2.572 16-13.143z" horiz-adv-x="476" />
|
||||||
|
<glyph unicode="" d="M324.857 188.572l87.428 84.857-120.572 17.715-54 109.143-54-109.143-120.572-17.714 87.428-84.857-20.857-120.286 108 56.857 107.714-56.857zM475.428 290.572q0-6.286-7.428-13.714l-103.714-101.143 24.572-142.857q0.286-2 0.286-5.714 0-14.286-11.714-14.286-5.428 0-11.428 3.428l-128.286 67.428-128.286-67.428q-6.285-3.428-11.428-3.428-6 0-9 4.143t-3 10.143q0 1.714 0.572 5.714l24.572 142.857-104 101.143q-7.143 7.714-7.143 13.714 0 10.572 16 13.143l143.428 20.857 64.286 130q5.428 11.714 14 11.714t14-11.714l64.286-130 143.429-20.857q16-2.572 16-13.143z" horiz-adv-x="476" />
|
||||||
|
<glyph unicode="" d="M338.857 202l73.428 71.428-120.572 17.714-8.572 17.143-45.428 92v-275.143l16.857-8.857 90.857-48-17.143 101.428-3.428 18.857zM468 276.857l-103.714-101.143 24.572-142.857q1.428-9.428-1.714-14.714t-9.714-5.286q-4.857 0-11.428 3.428l-128.286 67.428-128.286-67.428q-6.572-3.428-11.428-3.428-6.572 0-9.715 5.286t-1.715 14.714l24.572 142.857-104 101.143q-9.143 9.143-6.572 17t15.428 9.857l143.429 20.857 64.286 130q5.714 11.714 14 11.714 8 0 14-11.714l64.286-130 143.429-20.857q12.857-2 15.428-9.857t-6.857-17z" horiz-adv-x="476" />
|
||||||
|
</font></defs></svg>
|
||||||
|
After Width: | Height: | Size: 3.2 KiB |
BIN
resources/assets/plugins/jquery-raty/fonts/raty.ttf
Normal file
BIN
resources/assets/plugins/jquery-raty/fonts/raty.woff
Normal file
BIN
resources/assets/plugins/jquery-raty/images/cancel-off.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/assets/plugins/jquery-raty/images/cancel-on.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
resources/assets/plugins/jquery-raty/images/star-half.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
resources/assets/plugins/jquery-raty/images/star-off.png
Normal file
|
After Width: | Height: | Size: 781 B |
BIN
resources/assets/plugins/jquery-raty/images/star-on.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
46
resources/assets/plugins/jquery-raty/jquery.raty.css
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
.cancel-on-png, .cancel-off-png, .star-on-png, .star-off-png, .star-half-png {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "raty";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
src: url("./fonts/raty.eot");
|
||||||
|
src: url("./fonts/raty.eot?#iefix") format("embedded-opentype");
|
||||||
|
src: url("./fonts/raty.svg#raty") format("svg");
|
||||||
|
src: url("./fonts/raty.ttf") format("truetype");
|
||||||
|
src: url("./fonts/raty.woff") format("woff");
|
||||||
|
}
|
||||||
|
|
||||||
|
.cancel-on-png, .cancel-off-png, .star-on-png, .star-off-png, .star-half-png {
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
font-family: "raty";
|
||||||
|
font-style: normal;
|
||||||
|
font-variant: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: 1;
|
||||||
|
speak: none;
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cancel-on-png:before {
|
||||||
|
content: "\e600";
|
||||||
|
}
|
||||||
|
|
||||||
|
.cancel-off-png:before {
|
||||||
|
content: "\e601";
|
||||||
|
}
|
||||||
|
|
||||||
|
.star-on-png:before {
|
||||||
|
content: "\f005";
|
||||||
|
}
|
||||||
|
|
||||||
|
.star-off-png:before {
|
||||||
|
content: "\f006";
|
||||||
|
}
|
||||||
|
|
||||||
|
.star-half-png:before {
|
||||||
|
content: "\f123";
|
||||||
|
}
|
||||||
777
resources/assets/plugins/jquery-raty/jquery.raty.js
Normal file
@ -0,0 +1,777 @@
|
|||||||
|
/*!
|
||||||
|
* Raty - A Star Rating Plugin
|
||||||
|
*
|
||||||
|
* The MIT License
|
||||||
|
*
|
||||||
|
* author: Washington Botelho
|
||||||
|
* github: wbotelhos/raty
|
||||||
|
* version: 3.1.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(root, factory) {
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
define(['jquery'], factory);
|
||||||
|
} else if (typeof module === 'object' && module.exports) {
|
||||||
|
module.exports = factory(require('jquery'));
|
||||||
|
} else {
|
||||||
|
factory(root.jQuery);
|
||||||
|
}
|
||||||
|
}(this, function($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
$.raty = {
|
||||||
|
cancelButton: false,
|
||||||
|
cancelClass: 'raty-cancel',
|
||||||
|
cancelHint: 'Cancel this rating!',
|
||||||
|
cancelOff: 'cancel-off.png',
|
||||||
|
cancelOn: 'cancel-on.png',
|
||||||
|
cancelPlace: 'left',
|
||||||
|
click: undefined,
|
||||||
|
half: false,
|
||||||
|
halfShow: true,
|
||||||
|
hints: ['bad', 'poor', 'regular', 'good', 'gorgeous'],
|
||||||
|
iconRange: undefined,
|
||||||
|
iconRangeSame: false,
|
||||||
|
mouseout: undefined,
|
||||||
|
mouseover: undefined,
|
||||||
|
noRatedMsg: 'Not rated yet!',
|
||||||
|
number: 5,
|
||||||
|
numberMax: 20,
|
||||||
|
path: undefined,
|
||||||
|
precision: false,
|
||||||
|
readOnly: false,
|
||||||
|
round: { down: 0.25, full: 0.6, up: 0.76 },
|
||||||
|
score: undefined,
|
||||||
|
scoreName: 'score',
|
||||||
|
single: false,
|
||||||
|
space: true,
|
||||||
|
starHalf: 'star-half.png',
|
||||||
|
starOff: 'star-off.png',
|
||||||
|
starOn: 'star-on.png',
|
||||||
|
starType: 'img',
|
||||||
|
target: undefined,
|
||||||
|
targetFormat: '{score}',
|
||||||
|
targetKeep: false,
|
||||||
|
targetScore: undefined,
|
||||||
|
targetText: '',
|
||||||
|
targetType: 'hint'
|
||||||
|
};
|
||||||
|
|
||||||
|
$.fn.raty = function(options) {
|
||||||
|
return this.each(function() {
|
||||||
|
var instance = new $.raty.Raty(this, options);
|
||||||
|
|
||||||
|
return instance._create();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$.raty.Raty = (function() {
|
||||||
|
var Raty = function(element, options) {
|
||||||
|
this.element = element;
|
||||||
|
this.self = $(element);
|
||||||
|
this.opt = $.extend(true, {}, $.raty, options, this.self.data());
|
||||||
|
};
|
||||||
|
|
||||||
|
Raty.prototype = {
|
||||||
|
_create: function() {
|
||||||
|
this._executeCallbacks();
|
||||||
|
this._adjustNumber();
|
||||||
|
this._adjustHints();
|
||||||
|
|
||||||
|
this.opt.score = this._adjustedScore(this.opt.score);
|
||||||
|
|
||||||
|
if (this.opt.starType !== 'img') {
|
||||||
|
this._adjustStarName();
|
||||||
|
}
|
||||||
|
|
||||||
|
this._setPath();
|
||||||
|
this._createStars();
|
||||||
|
|
||||||
|
if (this.opt.cancelButton) {
|
||||||
|
this._createCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.opt.precision) {
|
||||||
|
this._adjustPrecision();
|
||||||
|
}
|
||||||
|
|
||||||
|
this._createScore();
|
||||||
|
|
||||||
|
this._apply(this.opt.score);
|
||||||
|
this._setTitle(this.opt.score);
|
||||||
|
this._target(this.opt.score);
|
||||||
|
|
||||||
|
if (this.opt.readOnly) {
|
||||||
|
this._lock();
|
||||||
|
} else {
|
||||||
|
this.element.style.cursor = 'pointer';
|
||||||
|
|
||||||
|
this._binds();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.self.data('raty', this);
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_adjustedScore: function(score) {
|
||||||
|
if (score || score === 0) {
|
||||||
|
return this._between(score, 0, this.opt.number);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_adjustHints: function() {
|
||||||
|
if (!this.opt.hints) {
|
||||||
|
this.opt.hints = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.opt.halfShow && !this.opt.half) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var steps = this.opt.precision ? 10 : 2;
|
||||||
|
|
||||||
|
for (var i = 0; i < this.opt.number; i++) {
|
||||||
|
var group = this.opt.hints[i];
|
||||||
|
|
||||||
|
if (Object.prototype.toString.call(group) !== '[object Array]') {
|
||||||
|
group = [group];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.opt.hints[i] = [];
|
||||||
|
|
||||||
|
for (var j = 0; j < steps; j++) {
|
||||||
|
var hint = group[j];
|
||||||
|
var last = group[group.length - 1];
|
||||||
|
|
||||||
|
if (last === undefined) {
|
||||||
|
last = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.opt.hints[i][j] = hint === undefined ? last : hint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_adjustNumber: function() {
|
||||||
|
this.opt.number = this._between(this.opt.number, 1, this.opt.numberMax);
|
||||||
|
},
|
||||||
|
|
||||||
|
_adjustPrecision: function() {
|
||||||
|
this.opt.half = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
_adjustStarName: function() {
|
||||||
|
var replaces = ['cancelOff', 'cancelOn', 'starHalf', 'starOff', 'starOn'];
|
||||||
|
|
||||||
|
this.opt.path = '';
|
||||||
|
|
||||||
|
for (var i = 0; i < replaces.length; i++) {
|
||||||
|
this.opt[replaces[i]] = this.opt[replaces[i]].replace('.', '-');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_apply: function(score) {
|
||||||
|
this._fill(score);
|
||||||
|
|
||||||
|
if (score) {
|
||||||
|
if (score > 0) {
|
||||||
|
this.scoreField.val(score);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._roundStars(score);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_attributesForIndex: function(i) {
|
||||||
|
var name = this._nameForIndex(i);
|
||||||
|
var attributes = { alt: i, src: this.opt.path + this.opt[name] };
|
||||||
|
|
||||||
|
if (this.opt.starType !== 'img') {
|
||||||
|
attributes = { 'data-alt': i, 'class': this.opt[name] };
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes.title = this._getHint(i);
|
||||||
|
|
||||||
|
return attributes;
|
||||||
|
},
|
||||||
|
|
||||||
|
_between: function(value, min, max) {
|
||||||
|
return Math.min(Math.max(parseFloat(value), min), max);
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_binds: function() {
|
||||||
|
if (this.cancelButton) {
|
||||||
|
this._bindOverCancel();
|
||||||
|
this._bindClickCancel();
|
||||||
|
this._bindOutCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
this._bindOver();
|
||||||
|
this._bindClick();
|
||||||
|
this._bindOut();
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_bindClick: function() {
|
||||||
|
var that = this;
|
||||||
|
|
||||||
|
this.stars.on('click.raty', function(evt) {
|
||||||
|
if (that.self.data('readonly')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var execute = true;
|
||||||
|
var score = (that.opt.half || that.opt.precision) ? that.self.data('score') : (this.alt || $(this).data('alt'));
|
||||||
|
|
||||||
|
if (that.opt.half && !that.opt.precision) {
|
||||||
|
score = that._roundHalfScore(score);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (that.opt.click) {
|
||||||
|
execute = that.opt.click.call(that.element, +score, evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (execute || execute === undefined) {
|
||||||
|
that._apply(+score);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_bindClickCancel: function() {
|
||||||
|
this.cancelButton.on('click.raty', function(evt) {
|
||||||
|
this.scoreField.removeAttr('value');
|
||||||
|
|
||||||
|
if (this.opt.click) {
|
||||||
|
this.opt.click.call(this.element, null, evt);
|
||||||
|
}
|
||||||
|
}.bind(this));
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_bindOut: function() {
|
||||||
|
this.self.on('mouseleave.raty', function(evt) {
|
||||||
|
var score = +this.scoreField.val() || undefined;
|
||||||
|
|
||||||
|
this._apply(score);
|
||||||
|
this._target(score, evt);
|
||||||
|
this._resetTitle();
|
||||||
|
|
||||||
|
if (this.opt.mouseout) {
|
||||||
|
this.opt.mouseout.call(this.element, score, evt);
|
||||||
|
}
|
||||||
|
}.bind(this));
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_bindOutCancel: function() {
|
||||||
|
var that = this;
|
||||||
|
|
||||||
|
this.cancelButton.on('mouseleave.raty', function(evt) {
|
||||||
|
var icon = that.opt.cancelOff;
|
||||||
|
|
||||||
|
if (that.opt.starType !== 'img') {
|
||||||
|
icon = that.opt.cancelClass + ' ' + icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
that._setIcon(this, icon);
|
||||||
|
|
||||||
|
if (that.opt.mouseout) {
|
||||||
|
var score = +that.scoreField.val() || undefined;
|
||||||
|
|
||||||
|
that.opt.mouseout.call(that.element, score, evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_bindOver: function() {
|
||||||
|
var that = this;
|
||||||
|
var action = that.opt.half ? 'mousemove.raty' : 'mouseover.raty';
|
||||||
|
|
||||||
|
this.stars.on(action, function(evt) {
|
||||||
|
var score = that._getScoreByPosition(evt, this);
|
||||||
|
|
||||||
|
that._fill(score);
|
||||||
|
|
||||||
|
if (that.opt.half) {
|
||||||
|
that._roundStars(score, evt);
|
||||||
|
that._setTitle(score, evt);
|
||||||
|
|
||||||
|
that.self.data('score', score);
|
||||||
|
}
|
||||||
|
|
||||||
|
that._target(score, evt);
|
||||||
|
|
||||||
|
if (that.opt.mouseover) {
|
||||||
|
that.opt.mouseover.call(that.element, score, evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_bindOverCancel: function() {
|
||||||
|
var that = this;
|
||||||
|
|
||||||
|
this.cancelButton.on('mouseover.raty', function(evt) {
|
||||||
|
if (that.self.data('readonly')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var starOff = that.opt.path + that.opt.starOff;
|
||||||
|
var icon = that.opt.cancelOn;
|
||||||
|
|
||||||
|
if (that.opt.starType === 'img') {
|
||||||
|
that.stars.attr('src', starOff);
|
||||||
|
} else {
|
||||||
|
icon = that.opt.cancelClass + ' ' + icon;
|
||||||
|
|
||||||
|
that.stars.attr('class', starOff);
|
||||||
|
}
|
||||||
|
|
||||||
|
that._setIcon(this, icon);
|
||||||
|
that._target(null, evt);
|
||||||
|
|
||||||
|
if (that.opt.mouseover) {
|
||||||
|
that.opt.mouseover.call(that.element, null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_buildScoreField: function() {
|
||||||
|
return $('<input />', { name: this.opt.scoreName, type: 'hidden' }).appendTo(this.self);
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_createCancel: function() {
|
||||||
|
var icon = this.opt.path + this.opt.cancelOff;
|
||||||
|
var button = $('<' + this.opt.starType + ' />', { title: this.opt.cancelHint, 'class': this.opt.cancelClass });
|
||||||
|
|
||||||
|
if (this.opt.starType === 'img') {
|
||||||
|
button.attr({ src: icon, alt: 'x' });
|
||||||
|
} else {
|
||||||
|
// TODO: use $.data
|
||||||
|
button.attr('data-alt', 'x').addClass(icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.opt.cancelPlace === 'left') {
|
||||||
|
this.self.prepend(' ').prepend(button);
|
||||||
|
} else {
|
||||||
|
this.self.append(' ').append(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.cancelButton = button;
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_createScore: function() {
|
||||||
|
var score = $(this.opt.targetScore);
|
||||||
|
|
||||||
|
this.scoreField = score.length ? score : this._buildScoreField();
|
||||||
|
},
|
||||||
|
|
||||||
|
_createStars: function() {
|
||||||
|
for (var i = 1; i <= this.opt.number; i++) {
|
||||||
|
var attributes = this._attributesForIndex(i);
|
||||||
|
|
||||||
|
$('<' + this.opt.starType + ' />', attributes).appendTo(this.element);
|
||||||
|
|
||||||
|
if (this.opt.space && i < this.opt.number) {
|
||||||
|
this.self.append(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.stars = this.self.children(this.opt.starType);
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_error: function(message) {
|
||||||
|
$(this).text(message);
|
||||||
|
|
||||||
|
$.error(message);
|
||||||
|
},
|
||||||
|
|
||||||
|
_executeCallbacks: function() {
|
||||||
|
var options = ['number', 'readOnly', 'score', 'scoreName', 'target', 'path'];
|
||||||
|
|
||||||
|
for (var i = 0; i < options.length; i++) {
|
||||||
|
if (typeof this.opt[options[i]] === 'function') {
|
||||||
|
var value = this.opt[options[i]].call(this.element);
|
||||||
|
|
||||||
|
if (value) {
|
||||||
|
this.opt[options[i]] = value;
|
||||||
|
} else {
|
||||||
|
delete this.opt[options[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_fill: function(score) {
|
||||||
|
var hash = 0;
|
||||||
|
|
||||||
|
if (this.opt.iconRangeSame && this.opt.iconRange) {
|
||||||
|
while (hash < this.opt.iconRange.length && this.opt.iconRange[hash].range < score) {
|
||||||
|
hash++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 1; i <= this.stars.length; i++) {
|
||||||
|
var icon;
|
||||||
|
var star = this.stars[i - 1];
|
||||||
|
var turnOn = this._turnOn(i, score);
|
||||||
|
|
||||||
|
if (this.opt.iconRange && this.opt.iconRange.length > hash) {
|
||||||
|
var irange = this.opt.iconRange[hash];
|
||||||
|
|
||||||
|
icon = this._getRangeIcon(irange, turnOn);
|
||||||
|
|
||||||
|
if (i <= irange.range) {
|
||||||
|
this._setIcon(star, icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i === irange.range) {
|
||||||
|
hash++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
icon = this.opt[turnOn ? 'starOn' : 'starOff'];
|
||||||
|
|
||||||
|
this._setIcon(star, icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_getDecimal: function(number, fractions) {
|
||||||
|
var decimal = number.toString().split('.')[1];
|
||||||
|
var result = 0;
|
||||||
|
|
||||||
|
if (decimal) {
|
||||||
|
result = parseInt(decimal.slice(0, fractions), 10);
|
||||||
|
|
||||||
|
if (decimal.slice(1, 5) === '9999') {
|
||||||
|
result++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_getRangeIcon: function(irange, turnOn) {
|
||||||
|
return turnOn ? irange.on || this.opt.starOn : irange.off || this.opt.starOff;
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_getScoreByPosition: function(evt, icon) {
|
||||||
|
var score = parseInt(icon.alt || icon.getAttribute('data-alt'), 10);
|
||||||
|
|
||||||
|
if (this.opt.half) {
|
||||||
|
var size = this._getWidth();
|
||||||
|
var percent = parseFloat((evt.pageX - $(icon).offset().left) / size);
|
||||||
|
|
||||||
|
score = score - 1 + percent;
|
||||||
|
}
|
||||||
|
|
||||||
|
return score;
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_getHint: function(score, evt) {
|
||||||
|
if (score !== 0 && !score) {
|
||||||
|
return this.opt.noRatedMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
var decimal = this._getDecimal(score, 1);
|
||||||
|
var integer = Math.ceil(score);
|
||||||
|
var group = this.opt.hints[(integer || 1) - 1];
|
||||||
|
var hint = group;
|
||||||
|
var set = !evt || this.isMove;
|
||||||
|
|
||||||
|
if (this.opt.precision) {
|
||||||
|
if (set) {
|
||||||
|
decimal = decimal === 0 ? 9 : decimal - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
hint = group[decimal];
|
||||||
|
} else if (this.opt.halfShow || this.opt.half) {
|
||||||
|
decimal = set && decimal === 0 ? 1 : decimal > 5 ? 1 : 0;
|
||||||
|
|
||||||
|
hint = group[decimal];
|
||||||
|
}
|
||||||
|
|
||||||
|
return hint === '' ? '' : hint || score;
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_getWidth: function() {
|
||||||
|
var width = this.stars[0].width || parseFloat(this.stars.eq(0).css('font-size'));
|
||||||
|
|
||||||
|
if (!width) {
|
||||||
|
this._error('Could not get the icon width!');
|
||||||
|
}
|
||||||
|
|
||||||
|
return width;
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_lock: function() {
|
||||||
|
var hint = this._getHint(this.scoreField.val());
|
||||||
|
|
||||||
|
this.element.style.cursor = '';
|
||||||
|
this.element.title = hint;
|
||||||
|
|
||||||
|
this.scoreField.prop('readonly', true);
|
||||||
|
this.stars.prop('title', hint);
|
||||||
|
|
||||||
|
if (this.cancelButton) {
|
||||||
|
this.cancelButton.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.self.data('readonly', true);
|
||||||
|
},
|
||||||
|
|
||||||
|
_nameForIndex: function(i) {
|
||||||
|
return this.opt.score && this.opt.score >= i ? 'starOn' : 'starOff';
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_resetTitle: function() {
|
||||||
|
for (var i = 0; i < this.opt.number; i++) {
|
||||||
|
this.stars[i].title = this._getHint(i + 1);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_roundHalfScore: function(score) {
|
||||||
|
var integer = parseInt(score, 10);
|
||||||
|
var decimal = this._getDecimal(score, 1);
|
||||||
|
|
||||||
|
if (decimal !== 0) {
|
||||||
|
decimal = decimal > 5 ? 1 : 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
return integer + decimal;
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_roundStars: function(score, evt) {
|
||||||
|
var name = this._starName(score, evt);
|
||||||
|
|
||||||
|
if (name) {
|
||||||
|
var icon = this.opt[name];
|
||||||
|
var star = this.stars[Math.ceil(score) - 1];
|
||||||
|
|
||||||
|
this._setIcon(star, icon);
|
||||||
|
} // Full down: [x.00 .. x.25]
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_setIcon: function(star, icon) {
|
||||||
|
star[this.opt.starType === 'img' ? 'src' : 'className'] = this.opt.path + icon;
|
||||||
|
},
|
||||||
|
|
||||||
|
_setPath: function() {
|
||||||
|
this.opt.path = this.opt.path || '';
|
||||||
|
|
||||||
|
if (this.opt.path && this.opt.path.slice(-1)[0] !== '/') {
|
||||||
|
this.opt.path += '/';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_setTarget: function(target, score) {
|
||||||
|
if (score) {
|
||||||
|
score = this.opt.targetFormat.toString().replace('{score}', score);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target.is(':input')) {
|
||||||
|
target.val(score);
|
||||||
|
} else {
|
||||||
|
target.html(score);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_setTitle: function(score, evt) {
|
||||||
|
if (score) {
|
||||||
|
var integer = parseInt(Math.ceil(score), 10);
|
||||||
|
var star = this.stars[integer - 1];
|
||||||
|
|
||||||
|
star.title = this._getHint(score, evt);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_starName: function(score, evt) {
|
||||||
|
var decimal = +(score % 1).toFixed(2);
|
||||||
|
|
||||||
|
if (evt || this.isMove) {
|
||||||
|
return decimal > 0.5 ? 'starOn' : 'starHalf';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (decimal <= this.opt.round.down) { // Down: [x.00 ... x.25]
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.opt.halfShow && decimal < this.opt.round.up) { // Half: [x.26 ... x.75]
|
||||||
|
return 'starHalf';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (decimal < this.opt.round.full) { // Off: [x.26 .. x.6]
|
||||||
|
return 'starOff';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'starOn'; // Up: [x.26 ...] || [x.6 ...]
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_target: function(score, evt) {
|
||||||
|
if (this.opt.target) {
|
||||||
|
var target = $(this.opt.target);
|
||||||
|
|
||||||
|
if (!target.length) {
|
||||||
|
this._error('Target selector invalid or missing!');
|
||||||
|
}
|
||||||
|
|
||||||
|
var mouseover = evt && evt.type === 'mouseover';
|
||||||
|
|
||||||
|
if (score === undefined) {
|
||||||
|
score = this.opt.targetText;
|
||||||
|
} else if (score === null) {
|
||||||
|
score = mouseover ? this.opt.cancelHint : this.opt.targetText;
|
||||||
|
} else {
|
||||||
|
if (this.opt.targetType === 'hint') {
|
||||||
|
score = this._getHint(score, evt);
|
||||||
|
} else if (this.opt.precision) {
|
||||||
|
score = parseFloat(score).toFixed(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
var mousemove = evt && evt.type === 'mousemove';
|
||||||
|
|
||||||
|
if (!mouseover && !mousemove && !this.opt.targetKeep) {
|
||||||
|
score = this.opt.targetText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._setTarget(target, score);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_turnOn: function(i, score) {
|
||||||
|
return this.opt.single ? (i === score) : (i <= score);
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
_unlock: function() {
|
||||||
|
this.element.style.cursor = 'pointer';
|
||||||
|
this.element.removeAttribute('title');
|
||||||
|
|
||||||
|
this.scoreField.removeAttr('readonly');
|
||||||
|
|
||||||
|
this.self.data('readonly', false);
|
||||||
|
|
||||||
|
this._resetTitle();
|
||||||
|
|
||||||
|
if (this.cancelButton) {
|
||||||
|
this.cancelButton.css('display', '');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
cancel: function(click) {
|
||||||
|
if (this.self.data('readonly') !== true) {
|
||||||
|
this[click ? 'click' : 'score'].call(this, null);
|
||||||
|
|
||||||
|
this.scoreField.removeAttr('value');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
click: function(score) {
|
||||||
|
if (this.self.data('readonly') !== true) {
|
||||||
|
score = this._adjustedScore(score);
|
||||||
|
|
||||||
|
this._apply(score);
|
||||||
|
|
||||||
|
if (this.opt.click) {
|
||||||
|
this.opt.click.call(this.element, score, $.Event('click'));
|
||||||
|
}
|
||||||
|
|
||||||
|
this._target(score);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
getScore: function() {
|
||||||
|
var score = [];
|
||||||
|
var value ;
|
||||||
|
|
||||||
|
value = this.scoreField.val();
|
||||||
|
|
||||||
|
score.push(value ? +value : undefined);
|
||||||
|
|
||||||
|
return (score.length > 1) ? score : score[0];
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
move: function(score) {
|
||||||
|
var integer = parseInt(score, 10);
|
||||||
|
var decimal = this._getDecimal(score, 1);
|
||||||
|
|
||||||
|
if (integer >= this.opt.number) {
|
||||||
|
integer = this.opt.number - 1;
|
||||||
|
decimal = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
var width = this._getWidth();
|
||||||
|
var steps = width / 10;
|
||||||
|
var star = $(this.stars[integer]);
|
||||||
|
var percent = star.offset().left + steps * decimal;
|
||||||
|
var evt = $.Event('mousemove', { pageX: percent });
|
||||||
|
|
||||||
|
this.isMove = true;
|
||||||
|
|
||||||
|
star.trigger(evt);
|
||||||
|
|
||||||
|
this.isMove = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
readOnly: function(readonly) {
|
||||||
|
if (this.self.data('readonly') !== readonly) {
|
||||||
|
if (readonly) {
|
||||||
|
this.self.off('.raty').children(this.opt.starType).off('.raty');
|
||||||
|
|
||||||
|
this._lock();
|
||||||
|
} else {
|
||||||
|
this._binds();
|
||||||
|
this._unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.self.data('readonly', readonly);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: model spec
|
||||||
|
score: function() {
|
||||||
|
return arguments.length ? this.setScore.apply(this, arguments) : this.getScore();
|
||||||
|
},
|
||||||
|
|
||||||
|
setScore: function(score) {
|
||||||
|
if (this.self.data('readonly') !== true) {
|
||||||
|
score = this._adjustedScore(score);
|
||||||
|
|
||||||
|
this._apply(score);
|
||||||
|
this._target(score);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return Raty;
|
||||||
|
})();
|
||||||
|
}));
|
||||||
58
resources/views/themexingkong/catalog.blade.php
Executable file
@ -0,0 +1,58 @@
|
|||||||
|
@extends('themes::themexingkong.layout')
|
||||||
|
|
||||||
|
@php
|
||||||
|
$years = Cache::remember('all_years', \Backpack\Settings\app\Models\Setting::get('site_cache_ttl', 5 * 60), function () {
|
||||||
|
return \VsMov\Core\Models\Movie::select('publish_year')->distinct()->pluck('publish_year')->sortDesc();
|
||||||
|
});
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
@push('header')
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="col-lg-wide-8 col-xs-1 padding-0">
|
||||||
|
<div class="stui-pannel stui-pannel-bg clearfix">
|
||||||
|
<div class="stui-pannel-box">
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
@include('themes::themexingkong.inc.catalog_filter')
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
<h1>{{ $section_name }}</h1>
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_bd">
|
||||||
|
<ul class="stui-vodlist clearfix">
|
||||||
|
@foreach ($data as $movie)
|
||||||
|
<li class="col-md-5 col-sm-4 col-xs-3">
|
||||||
|
<div class="stui-vodlist__box">
|
||||||
|
<a class="stui-vodlist__thumb lazyload" href="{{ $movie->getUrl() }}"
|
||||||
|
title="{{ $movie->name }}" data-original="{{ $movie->getThumbUrl() }}">
|
||||||
|
<span class="play hidden-xs"></span>
|
||||||
|
<span class="pic-text text-right">{{ $movie->episode_current }}</span>
|
||||||
|
</a>
|
||||||
|
<div class="stui-vodlist__detail">
|
||||||
|
<h4 class="title text-overflow">
|
||||||
|
<a href="{{ $movie->getUrl() }}"
|
||||||
|
title="{{ $movie->name }}">{{ $movie->name }}</a>
|
||||||
|
</h4>
|
||||||
|
<p class="text text-overflow text-muted hidden-xs">{{ $movie->origin_name }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ $data->appends(request()->all())->links('themes::themexingkong.inc.pagination') }}
|
||||||
|
</div>
|
||||||
|
@include('themes::themexingkong.inc.right_bar')
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(".score").each(function() {
|
||||||
|
var star = $(this).find(".branch").text().replace(".", "0.");
|
||||||
|
$(this).find("#score").css("width", "" + star + "%");
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
425
resources/views/themexingkong/episode.blade.php
Executable file
@ -0,0 +1,425 @@
|
|||||||
|
@extends('themes::themexingkong.layout')
|
||||||
|
|
||||||
|
@push('header')
|
||||||
|
<style>
|
||||||
|
#wrapper-video {
|
||||||
|
height: 505px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 500px) {
|
||||||
|
#wrapper-video {
|
||||||
|
height: 210px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (min-width: 501px) and (max-width: 767px) {
|
||||||
|
#wrapper-video {
|
||||||
|
height: 286px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (min-width: 768px) and (max-width: 991px) {
|
||||||
|
#wrapper-video {
|
||||||
|
height: 388px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (min-width: 992px) and (max-width: 1199px) {
|
||||||
|
#wrapper-video {
|
||||||
|
height: 525px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="col-lg-wide-8 col-xs-1 padding-0">
|
||||||
|
<div class="stui-pannel stui-pannel-bg clearfix">
|
||||||
|
<div class="stui-pannel-box">
|
||||||
|
<div class="stui-pannel-bd">
|
||||||
|
<div class="stui-player col-pd">
|
||||||
|
<div id="wrapper-video" class="stui-player__video clearfix">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="stui-player__detail detail">
|
||||||
|
<ul class="more-btn">
|
||||||
|
<li>
|
||||||
|
<div class="" style="display: flex;gap:5px">
|
||||||
|
@foreach ($currentMovie->episodes->where('slug', $episode->slug)->where('server', $episode->server) as $server)
|
||||||
|
<button onclick="chooseStreamingServer(this)" data-type="{{ $server->type }}"
|
||||||
|
data-id="{{ $server->id }}" data-link="{{ $server->link }}"
|
||||||
|
class="streaming-server btn btn-default">VIP
|
||||||
|
#{{ $loop->index + 1 }}</button>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<button class="btn btn-default" id="report_error">Báo lỗi
|
||||||
|
<i class="icon iconfont icon-close "></i>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h1 class="title">
|
||||||
|
<a href="{{ $episode->getUrl() }}">Tập {{ $episode->name }}</a>
|
||||||
|
</h1>
|
||||||
|
<p>
|
||||||
|
<span class="title">Đổi nguồn phát VIP #1, VIP #2 khi lỗi.</span>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div id="movies-rating-star"></div>
|
||||||
|
({{ $currentMovie->getRatingStar() }}
|
||||||
|
sao
|
||||||
|
/
|
||||||
|
{{ $currentMovie->getRatingCount() }} đánh giá)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@foreach ($currentMovie->episodes->sortBy([['server', 'asc']])->groupBy('server') as $server => $data)
|
||||||
|
<div class="stui-pannel stui-pannel-bg clearfix">
|
||||||
|
<div class="stui-pannel-box b playlist mb">
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
<div class="stui-pannel__head bottom-line active clearfix">
|
||||||
|
<span class="more text-muted pull-right"></span>
|
||||||
|
<h3 class="title"> Phim {{ $currentMovie->name }} - {{ $server }} </h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_bd col-pd clearfix">
|
||||||
|
<ul class="stui-content__playlist clearfix">
|
||||||
|
@foreach ($data->sortByDesc('name', SORT_NATURAL)->groupBy('name') as $name => $item)
|
||||||
|
<li class="@if ($item->contains($episode)) active @endif"><a
|
||||||
|
href="{{ $item->sortByDesc('type')->first()->getUrl() }}">Tập
|
||||||
|
{{ $name }}</a>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
<div class="stui-pannel stui-pannel-bg clearfix">
|
||||||
|
<div class="stui-pannel-box">
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
<div class="stui-pannel__head clearfix">
|
||||||
|
<h3 class="title">
|
||||||
|
<img src="{{ asset('themes/xingkong/img/icon_30.png') }}" /> Nội dung phim
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_bd">
|
||||||
|
<p class="col-pd detail">
|
||||||
|
<span class="detail-sketch">
|
||||||
|
{!! Str::limit(strip_tags($currentMovie->content), 300, '...') !!}
|
||||||
|
</span>
|
||||||
|
<span class="detail-content" style="display: none;">
|
||||||
|
{!! strip_tags($currentMovie->content) !!}
|
||||||
|
</span>
|
||||||
|
<a class="detail-more" href="javascript:;">Xem thêm <i class="icon iconfont icon-moreunfold"></i>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@include('themes::themexingkong.inc.related_movie')
|
||||||
|
@include('themes::themexingkong.inc.comment')
|
||||||
|
</div>
|
||||||
|
@include('themes::themexingkong.inc.right_bar')
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script src="/themes/xingkong/player/js/p2p-media-loader-core.min.js"></script>
|
||||||
|
<script src="/themes/xingkong/player/js/p2p-media-loader-hlsjs.min.js"></script>
|
||||||
|
|
||||||
|
<script src="/js/jwplayer-8.9.3.js"></script>
|
||||||
|
<script src="/js/hls.min.js"></script>
|
||||||
|
<script src="/js/jwplayer.hlsjs.min.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var episode_id = {{ $episode->id }};
|
||||||
|
const wrapper = document.getElementById('wrapper-video');
|
||||||
|
const vastAds = "{{ Setting::get('jwplayer_advertising_file') }}";
|
||||||
|
|
||||||
|
function chooseStreamingServer(el) {
|
||||||
|
const type = el.dataset.type;
|
||||||
|
const link = el.dataset.link.replace(/^http:\/\//i, 'https://');
|
||||||
|
const id = el.dataset.id;
|
||||||
|
|
||||||
|
const newUrl =
|
||||||
|
location.protocol +
|
||||||
|
"//" +
|
||||||
|
location.host +
|
||||||
|
location.pathname.replace(`-${episode_id}`, `-${id}`);
|
||||||
|
|
||||||
|
history.pushState({
|
||||||
|
path: newUrl
|
||||||
|
}, "", newUrl);
|
||||||
|
episode_id = id;
|
||||||
|
|
||||||
|
Array.from(document.getElementsByClassName('streaming-server')).forEach(server => {
|
||||||
|
server.classList.remove('btn-primary');
|
||||||
|
})
|
||||||
|
el.classList.add('btn-primary');
|
||||||
|
renderPlayer(type, link, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderPlayer(type, link, id) {
|
||||||
|
if (type == 'embed') {
|
||||||
|
if (vastAds) {
|
||||||
|
wrapper.innerHTML = `<div id="fake_jwplayer"></div>`;
|
||||||
|
const fake_player = jwplayer("fake_jwplayer");
|
||||||
|
const objSetupFake = {
|
||||||
|
key: "{{ Setting::get('jwplayer_license') }}",
|
||||||
|
aspectratio: "16:9",
|
||||||
|
width: "100%",
|
||||||
|
file: "/themes/xingkong/player/1s_blank.mp4",
|
||||||
|
volume: 100,
|
||||||
|
mute: false,
|
||||||
|
autostart: true,
|
||||||
|
advertising: {
|
||||||
|
tag: "{{ Setting::get('jwplayer_advertising_file') }}",
|
||||||
|
client: "vast",
|
||||||
|
vpaidmode: "insecure",
|
||||||
|
skipoffset: {{ (int) Setting::get('jwplayer_advertising_skipoffset') ?: 5 }}, // Bỏ qua quảng cáo trong vòng 5 giây
|
||||||
|
skipmessage: "Bỏ qua sau xx giây",
|
||||||
|
skiptext: "Bỏ qua"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fake_player.setup(objSetupFake);
|
||||||
|
fake_player.on('complete', function(event) {
|
||||||
|
$("#fake_jwplayer").remove();
|
||||||
|
wrapper.innerHTML = `<iframe width="100%" height="100%" src="${link}" frameborder="0" scrolling="no"
|
||||||
|
allowfullscreen="" allow='autoplay'></iframe>`
|
||||||
|
fake_player.remove();
|
||||||
|
});
|
||||||
|
|
||||||
|
fake_player.on('adSkipped', function(event) {
|
||||||
|
$("#fake_jwplayer").remove();
|
||||||
|
wrapper.innerHTML = `<iframe width="100%" height="100%" src="${link}" frameborder="0" scrolling="no"
|
||||||
|
allowfullscreen="" allow='autoplay'></iframe>`
|
||||||
|
fake_player.remove();
|
||||||
|
});
|
||||||
|
|
||||||
|
fake_player.on('adComplete', function(event) {
|
||||||
|
$("#fake_jwplayer").remove();
|
||||||
|
wrapper.innerHTML = `<iframe width="100%" height="100%" src="${link}" frameborder="0" scrolling="no"
|
||||||
|
allowfullscreen="" allow='autoplay'></iframe>`
|
||||||
|
fake_player.remove();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (wrapper) {
|
||||||
|
wrapper.innerHTML = `<iframe width="100%" height="100%" src="${link}" frameborder="0" scrolling="no"
|
||||||
|
allowfullscreen="" allow='autoplay'></iframe>`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == 'm3u8' || type == 'mp4') {
|
||||||
|
wrapper.innerHTML = `<div id="jwplayer"></div>`;
|
||||||
|
const player = jwplayer("jwplayer");
|
||||||
|
const objSetup = {
|
||||||
|
key: "{{ Setting::get('jwplayer_license') }}",
|
||||||
|
aspectratio: "16:9",
|
||||||
|
width: "100%",
|
||||||
|
file: link,
|
||||||
|
playbackRateControls: true,
|
||||||
|
playbackRates: [0.25, 0.75, 1, 1.25],
|
||||||
|
sharing: {
|
||||||
|
sites: [
|
||||||
|
"reddit",
|
||||||
|
"facebook",
|
||||||
|
"twitter",
|
||||||
|
"googleplus",
|
||||||
|
"email",
|
||||||
|
"linkedin",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
volume: 100,
|
||||||
|
mute: false,
|
||||||
|
autostart: true,
|
||||||
|
logo: {
|
||||||
|
file: "{{ Setting::get('jwplayer_logo_file') }}",
|
||||||
|
link: "{{ Setting::get('jwplayer_logo_link') }}",
|
||||||
|
position: "{{ Setting::get('jwplayer_logo_position') }}",
|
||||||
|
},
|
||||||
|
advertising: {
|
||||||
|
tag: "{{ Setting::get('jwplayer_advertising_file') }}",
|
||||||
|
client: "vast",
|
||||||
|
vpaidmode: "insecure",
|
||||||
|
skipoffset: {{ (int) Setting::get('jwplayer_advertising_skipoffset') ?: 5 }}, // Bỏ qua quảng cáo trong vòng 5 giây
|
||||||
|
skipmessage: "Bỏ qua sau xx giây",
|
||||||
|
skiptext: "Bỏ qua"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (type == 'm3u8') {
|
||||||
|
const segments_in_queue = 50;
|
||||||
|
|
||||||
|
var engine_config = {
|
||||||
|
debug: !1,
|
||||||
|
segments: {
|
||||||
|
forwardSegmentCount: 50,
|
||||||
|
},
|
||||||
|
loader: {
|
||||||
|
cachedSegmentExpiration: 864e5,
|
||||||
|
cachedSegmentsCount: 1e3,
|
||||||
|
requiredSegmentsPriority: segments_in_queue,
|
||||||
|
httpDownloadMaxPriority: 9,
|
||||||
|
httpDownloadProbability: 0.06,
|
||||||
|
httpDownloadProbabilityInterval: 1e3,
|
||||||
|
httpDownloadProbabilitySkipIfNoPeers: !0,
|
||||||
|
p2pDownloadMaxPriority: 50,
|
||||||
|
httpFailedSegmentTimeout: 500,
|
||||||
|
simultaneousP2PDownloads: 20,
|
||||||
|
simultaneousHttpDownloads: 2,
|
||||||
|
// httpDownloadInitialTimeout: 12e4,
|
||||||
|
// httpDownloadInitialTimeoutPerSegment: 17e3,
|
||||||
|
httpDownloadInitialTimeout: 0,
|
||||||
|
httpDownloadInitialTimeoutPerSegment: 17e3,
|
||||||
|
httpUseRanges: !0,
|
||||||
|
maxBufferLength: 300,
|
||||||
|
// useP2P: false,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
if (Hls.isSupported() && p2pml.hlsjs.Engine.isSupported()) {
|
||||||
|
var engine = new p2pml.hlsjs.Engine(engine_config);
|
||||||
|
player.setup(objSetup);
|
||||||
|
jwplayer_hls_provider.attach();
|
||||||
|
p2pml.hlsjs.initJwPlayer(player, {
|
||||||
|
liveSyncDurationCount: segments_in_queue, // To have at least 7 segments in queue
|
||||||
|
maxBufferLength: 300,
|
||||||
|
loader: engine.createLoaderClass(),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
player.setup(objSetup);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
player.setup(objSetup);
|
||||||
|
}
|
||||||
|
|
||||||
|
const resumeData = 'OPCMS-PlayerPosition-' + id;
|
||||||
|
|
||||||
|
player.on('ready', function() {
|
||||||
|
if (typeof(Storage) !== 'undefined') {
|
||||||
|
if (localStorage[resumeData] == '' || localStorage[resumeData] == 'undefined') {
|
||||||
|
console.log("No cookie for position found");
|
||||||
|
var currentPosition = 0;
|
||||||
|
} else {
|
||||||
|
if (localStorage[resumeData] == "null") {
|
||||||
|
localStorage[resumeData] = 0;
|
||||||
|
} else {
|
||||||
|
var currentPosition = localStorage[resumeData];
|
||||||
|
}
|
||||||
|
console.log("Position cookie found: " + localStorage[resumeData]);
|
||||||
|
}
|
||||||
|
player.once('play', function() {
|
||||||
|
console.log('Checking position cookie!');
|
||||||
|
console.log(Math.abs(player.getDuration() - currentPosition));
|
||||||
|
if (currentPosition > 180 && Math.abs(player.getDuration() - currentPosition) >
|
||||||
|
5) {
|
||||||
|
player.seek(currentPosition);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
window.onunload = function() {
|
||||||
|
localStorage[resumeData] = player.getPosition();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log('Your browser is too old!');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
player.on('complete', function() {
|
||||||
|
if (typeof(Storage) !== 'undefined') {
|
||||||
|
localStorage.removeItem(resumeData);
|
||||||
|
} else {
|
||||||
|
console.log('Your browser is too old!');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
function formatSeconds(seconds) {
|
||||||
|
var date = new Date(1970, 0, 1);
|
||||||
|
date.setSeconds(seconds);
|
||||||
|
return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
|
const episode = '{{ $episode->id }}';
|
||||||
|
let playing = document.querySelector(`[data-id="${episode}"]`);
|
||||||
|
if (playing) {
|
||||||
|
playing.click();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const servers = document.getElementsByClassName('streaming-server');
|
||||||
|
if (servers[0]) {
|
||||||
|
servers[0].click();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script src="/themes/xingkong/plugins/jquery-raty/jquery.raty.js"></script>
|
||||||
|
<link href="/themes/xingkong/plugins/jquery-raty/jquery.raty.css" rel="stylesheet" type="text/css" />
|
||||||
|
<script>
|
||||||
|
var rated = false;
|
||||||
|
$('#movies-rating-star').raty({
|
||||||
|
score: {{ $currentMovie->getRatingStar() }},
|
||||||
|
number: 10,
|
||||||
|
numberMax: 10,
|
||||||
|
hints: ['quá tệ', 'tệ', 'không hay', 'không hay lắm', 'bình thường', 'xem được', 'có vẻ hay', 'hay',
|
||||||
|
'rất hay', 'siêu phẩm'
|
||||||
|
],
|
||||||
|
starOff: '/themes/xingkong/plugins/jquery-raty/images/star-off.png',
|
||||||
|
starOn: '/themes/xingkong/plugins/jquery-raty/images/star-on.png',
|
||||||
|
starHalf: '/themes/xingkong/plugins/jquery-raty/images/star-half.png',
|
||||||
|
click: function(score, evt) {
|
||||||
|
if (rated) return
|
||||||
|
fetch("{{ route('movie.rating', ['movie' => $currentMovie->slug]) }}", {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
'X-CSRF-TOKEN': document.querySelector(
|
||||||
|
'meta[name="csrf-token"]')
|
||||||
|
.getAttribute(
|
||||||
|
'content')
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
rating: score
|
||||||
|
})
|
||||||
|
});
|
||||||
|
rated = true;
|
||||||
|
$('#movies-rating-star').data('raty').readOnly(true);
|
||||||
|
alert(`Bạn đã đánh giá ${score} sao cho phim này!`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$("#report_error").click(() => {
|
||||||
|
fetch("{{ route('episodes.report', ['movie' => $currentMovie->slug, 'episode' => $episode->slug, 'id' => $episode->id]) }}", {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute(
|
||||||
|
'content')
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
message: ''
|
||||||
|
})
|
||||||
|
});
|
||||||
|
$("#report_error").remove();
|
||||||
|
alert("Báo lỗi thành công!")
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{!! setting('site_scripts_facebook_sdk') !!}
|
||||||
|
@endpush
|
||||||
59
resources/views/themexingkong/inc/catalog_filter.blade.php
Executable file
@ -0,0 +1,59 @@
|
|||||||
|
<div>
|
||||||
|
<h2 class="title">Bộ lọc phim</h2>
|
||||||
|
<form action="/" method="GET" id="form-filter">
|
||||||
|
<div class="row">
|
||||||
|
<div class="form-group col-md-6 col-sm-3 col-xs-2">
|
||||||
|
<select class="form-control" id="sort" name="filter[sort]" form="form-filter">
|
||||||
|
<option value="">Sắp xếp</option>
|
||||||
|
<option value="update" @if (isset(request('filter')['sort']) && request('filter')['sort'] == 'update') selected @endif>Thời gian cập nhật
|
||||||
|
</option>
|
||||||
|
<option value="create" @if (isset(request('filter')['sort']) && request('filter')['sort'] == 'create') selected @endif>Thời gian đăng</option>
|
||||||
|
<option value="year" @if (isset(request('filter')['sort']) && request('filter')['sort'] == 'year') selected @endif>Năm sản xuất</option>
|
||||||
|
<option value="view" @if (isset(request('filter')['sort']) && request('filter')['sort'] == 'view') selected @endif>Lượt xem</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group col-md-6 col-sm-3 col-xs-2">
|
||||||
|
<select class="form-control" id="type" name="filter[type]" form="form-filter">
|
||||||
|
<option value="">Mọi định dạng</option>
|
||||||
|
<option value="series" @if (isset(request('filter')['type']) && request('filter')['type'] == 'series') selected @endif>Phim bộ</option>
|
||||||
|
<option value="single" @if (isset(request('filter')['type']) && request('filter')['type'] == 'single') selected @endif>Phim lẻ</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group col-md-6 col-sm-3 col-xs-2">
|
||||||
|
<select class="form-control" id="category" name="filter[category]" form="form-filter">
|
||||||
|
<option value="">Tất cả thể loại</option>
|
||||||
|
@foreach (\VsMov\Core\Models\Category::fromCache()->all() as $item)
|
||||||
|
<option value="{{ $item->id }}" @if (
|
||||||
|
(isset(request('filter')['category']) && request('filter')['category'] == $item->id) ||
|
||||||
|
(isset($category) && $category->id == $item->id)) selected @endif>
|
||||||
|
{{ $item->name }}</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group col-md-6 col-sm-3 col-xs-2">
|
||||||
|
<select class="form-control" name="filter[region]" form="form-filter">
|
||||||
|
<option value="">Tất cả quốc gia</option>
|
||||||
|
@foreach (\VsMov\Core\Models\Region::fromCache()->all() as $item)
|
||||||
|
<option value="{{ $item->id }}" @if (
|
||||||
|
(isset(request('filter')['region']) && request('filter')['region'] == $item->id) ||
|
||||||
|
(isset($region) && $region->id == $item->id)) selected @endif>
|
||||||
|
{{ $item->name }}</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group col-md-6 col-sm-3 col-xs-2">
|
||||||
|
<select class="form-control" name="filter[year]" form="form-filter">
|
||||||
|
<option value="">Tất cả năm</option>
|
||||||
|
@foreach ($years as $year)
|
||||||
|
<option value="{{ $year }}" @if (isset(request('filter')['year']) && request('filter')['year'] == $year) selected @endif>
|
||||||
|
{{ $year }}</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group col-md-6 col-sm-3 col-xs-2 text-center">
|
||||||
|
<button type="submit" form="form-filter" class="btn btn-primary">Lọc</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
20
resources/views/themexingkong/inc/comment.blade.php
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
<div class="stui-pannel stui-pannel-bg clearfix">
|
||||||
|
<div class="stui-pannel-box clearfix">
|
||||||
|
<div class="stui-pannel_bd clearfix">
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
<div class="stui-pannel__head clearfix">
|
||||||
|
<h3 class="title">
|
||||||
|
<img src="{{ asset('themes/xingkong/img/icon_30.png') }}" /> Bình luận
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_bd">
|
||||||
|
<div style="width: 100%; background-color: #fff">
|
||||||
|
<div style="width: 100%; background-color: #fff" class="fb-comments"
|
||||||
|
data-href="{{ $currentMovie->getUrl() }}" data-width="100%" data-colorscheme="light"
|
||||||
|
data-numposts="5" data-order-by="reverse_time" data-lazy="true"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
59
resources/views/themexingkong/inc/header.blade.php
Executable file
@ -0,0 +1,59 @@
|
|||||||
|
@php
|
||||||
|
$logo = setting('site_logo', '');
|
||||||
|
$brand = setting('site_brand', '');
|
||||||
|
$title = isset($title) ? $title : setting('site_homepage_title', '');
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
<header class="stui-header__top clearfix">
|
||||||
|
<div class="stui-header__bar clearfix">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="stui-header__logo">
|
||||||
|
<a href="/">
|
||||||
|
@if ($logo)
|
||||||
|
{!! $logo !!}
|
||||||
|
@else
|
||||||
|
{!! $brand !!}
|
||||||
|
@endif
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="stui-header__search">
|
||||||
|
<form action="/" method="GET">
|
||||||
|
<input type="text" name="search" class="mac_wd form-control" value="{{ request('search') }}"
|
||||||
|
placeholder="Tìm kiếm phim..." />
|
||||||
|
<button class="submit" type="submit">
|
||||||
|
<i class="icon iconfont icon-search"></i>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stui-header__menu clearfix">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<ul class="">
|
||||||
|
@foreach ($menu as $key => $item)
|
||||||
|
@if (count($item['children']))
|
||||||
|
<li class="dropdown">
|
||||||
|
<a href="{{ $item['link'] }}">{{ $item['name'] }} <i
|
||||||
|
class="icon iconfont icon-moreunfold"></i></a>
|
||||||
|
<ul class="submenu">
|
||||||
|
@foreach ($item['children'] as $children)
|
||||||
|
<li class="">
|
||||||
|
<a href="{{ $children['link'] }}">{{ $children['name'] }}</a>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
@else
|
||||||
|
<li>
|
||||||
|
<a href="{{ $item['link'] }}">{{ $item['name'] }}</a>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
42
resources/views/themexingkong/inc/pagination.blade.php
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
@php
|
||||||
|
$pageRange = 3;
|
||||||
|
@endphp
|
||||||
|
@if ($paginator->hasPages())
|
||||||
|
<ul class="stui-page text-center clearfix">
|
||||||
|
{{-- Previous Page Link --}}
|
||||||
|
@if ($paginator->onFirstPage())
|
||||||
|
@else
|
||||||
|
<li><a title="Trang trước" href="{{ $paginator->previousPageUrl() }}"> << </a></li>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
{{-- Pagination Elements --}}
|
||||||
|
@foreach ($elements as $element)
|
||||||
|
{{-- Array Of Links --}}
|
||||||
|
@if (is_array($element))
|
||||||
|
@foreach ($element as $page => $url)
|
||||||
|
@if ($page == $paginator->currentPage())
|
||||||
|
<li class="hidden-xs active"><a title="Trang {{ $page }}"
|
||||||
|
href="#">{{ $page }}</a></li>
|
||||||
|
<li class="active visible-xs">
|
||||||
|
<span class="num">{{ $page }}/{{ $paginator->total() }}</span>
|
||||||
|
</li>
|
||||||
|
@else
|
||||||
|
@if (
|
||||||
|
($page > $paginator->currentPage() && $page < $paginator->currentPage() + $pageRange) ||
|
||||||
|
($page < $paginator->currentPage() && $page > $paginator->currentPage() - $pageRange))
|
||||||
|
<li class="hidden-xs">
|
||||||
|
<a title="Trang {{ $page }}" href="{{ $url }}">{{ $page }}</a>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
{{-- Next Page Link --}}
|
||||||
|
@if ($paginator->hasMorePages())
|
||||||
|
<li><a title="Trang tiếp" href="{{ $paginator->nextPageUrl() }}">>></a></li>
|
||||||
|
@else
|
||||||
|
@endif
|
||||||
|
</ul>
|
||||||
|
@endif
|
||||||
32
resources/views/themexingkong/inc/related_movie.blade.php
Executable file
@ -0,0 +1,32 @@
|
|||||||
|
<div class="stui-pannel stui-pannel-bg clearfix">
|
||||||
|
<div class="stui-pannel-box">
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
<div class="stui-pannel__head bottom-line active clearfix">
|
||||||
|
<h3 class="title">
|
||||||
|
<img src="{{ asset('themes/xingkong/img/icon_6.png') }}" /> Có thể bạn sẽ thích?
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_bd">
|
||||||
|
<ul class="stui-vodlist__bd clearfix">
|
||||||
|
@foreach ($movie_related as $movie)
|
||||||
|
<li class="col-md-6 col-sm-4 col-xs-3 ">
|
||||||
|
<div class="stui-vodlist__box">
|
||||||
|
<a class="stui-vodlist__thumb lazyload" href="{{ $movie->getUrl() }}"
|
||||||
|
title="{{ $movie->name }}" data-original="{{ $movie->getThumbUrl() }}">
|
||||||
|
<span class="play hidden-xs"></span>
|
||||||
|
<span class="pic-text text-right">{{ $movie->episode_current }}</span>
|
||||||
|
</a>
|
||||||
|
<div class="stui-vodlist__detail">
|
||||||
|
<h4 class="title text-overflow">
|
||||||
|
<a href="{{ $movie->getUrl() }}" title="{{ $movie->name }}">{{ $movie->name }}</a>
|
||||||
|
</h4>
|
||||||
|
<p class="text text-overflow text-muted hidden-xs">{{ $movie->origin_name }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
37
resources/views/themexingkong/inc/right_bar.blade.php
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<div class="col-lg-wide-2 col-xs-1 stui-pannel-side visible-lg">
|
||||||
|
@foreach ($tops as $top)
|
||||||
|
<div class="stui-pannel stui-pannel-bg clearfix">
|
||||||
|
<div class="col-pd clearfix">
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
<div class="stui-pannel__head bottom-line active clearfix">
|
||||||
|
<h3 class="title"> {{ $top['label'] }} </h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_bd">
|
||||||
|
<ul class="stui-vodlist__media active col-pd clearfix">
|
||||||
|
@foreach ($top['data'] as $movie)
|
||||||
|
<li class="top-line-dot">
|
||||||
|
<div class="thumb">
|
||||||
|
<a class="stui-vodlist__thumb" href="{{ $movie->getUrl() }}"
|
||||||
|
title="{{ $movie->name }}"
|
||||||
|
style="width: 33.5px; background-image: url({{ $movie->getThumbUrl() }});"></a>
|
||||||
|
</div>
|
||||||
|
<div class="detail detail-side" style="padding-top: 5px;">
|
||||||
|
<p class="margin-0 text_single-line">
|
||||||
|
<a href="{{ $movie->getUrl() }}">{{ $movie->name }}</a>
|
||||||
|
</p>
|
||||||
|
<div class="score">
|
||||||
|
<div class="star">
|
||||||
|
<span class="star-cur" id="score"></span>
|
||||||
|
</div>
|
||||||
|
<span class="branch">{{ $movie->getRatingStar() }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
42
resources/views/themexingkong/inc/sections/default.blade.php
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<div class="stui-pannel clearfix">
|
||||||
|
<div class="stui-pannel-box padding-0">
|
||||||
|
<div class="col-lg-wide-9.5 col-xs-1 padding-0">
|
||||||
|
<div class="col-pd stui-pannel-bg">
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
<div class="stui-pannel__head bottom-line active clearfix">
|
||||||
|
<a class="more text-muted pull-right" href="{{ $item['link'] }}">Xem thêm <i
|
||||||
|
class="icon iconfont icon-more"></i>
|
||||||
|
</a>
|
||||||
|
<h3 class="title">
|
||||||
|
<img src="{{ asset('themes/xingkong/img/icon_1.png') }}" alt="{{ $item['label'] }}" />
|
||||||
|
<a href="{{ $item['link'] }}">{{ $item['label'] }}</a>
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_bd clearfix">
|
||||||
|
<ul class="stui-vodlist clearfix">
|
||||||
|
@foreach ($item['data'] as $movie)
|
||||||
|
<li class="col-md-6 col-sm-4 col-xs-3 ">
|
||||||
|
<div class="stui-vodlist__box">
|
||||||
|
<a class="stui-vodlist__thumb lazyload" href="{{ $movie->getUrl() }}"
|
||||||
|
title="{{ $movie->name }}" data-original="{{ $movie->getThumbUrl() }}">
|
||||||
|
<span class="play hidden-xs"></span>
|
||||||
|
<span class="pic-text text-right">{{ $movie->episode_current }}</span>
|
||||||
|
</a>
|
||||||
|
<div class="stui-vodlist__detail">
|
||||||
|
<h4 class="title text-overflow">
|
||||||
|
<a href="{{ $movie->getUrl() }}"
|
||||||
|
title="{{ $movie->name }}">{{ $movie->name }}</a>
|
||||||
|
</h4>
|
||||||
|
<p class="text text-overflow text-muted hidden-xs">{{ $movie->origin_name }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
<div class="stui-pannel clearfix">
|
||||||
|
<div class="stui-pannel-box padding-0">
|
||||||
|
<div class="col-lg-wide-8 col-xs-1 padding-0">
|
||||||
|
<div class="col-pd stui-pannel-bg">
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
<div class="stui-pannel__head bottom-line active clearfix">
|
||||||
|
<a class="more text-muted pull-right" href="{{ $item['link'] }}">Xem thêm <i
|
||||||
|
class="icon iconfont icon-more"></i>
|
||||||
|
</a>
|
||||||
|
<h3 class="title">
|
||||||
|
<img src="{{ asset('themes/xingkong/img/icon_1.png') }}" alt="{{ $item['label'] }}" />
|
||||||
|
<a href="{{ $item['link'] }}">{{ $item['label'] }}</a>
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_bd clearfix">
|
||||||
|
<ul class="stui-vodlist clearfix">
|
||||||
|
@foreach ($item['data'] as $movie)
|
||||||
|
<li class="col-md-5 col-sm-4 col-xs-3 ">
|
||||||
|
<div class="stui-vodlist__box">
|
||||||
|
<a class="stui-vodlist__thumb lazyload" href="{{ $movie->getUrl() }}"
|
||||||
|
title="{{ $movie->name }}" data-original="{{ $movie->getThumbUrl() }}">
|
||||||
|
<span class="play hidden-xs"></span>
|
||||||
|
<span class="pic-text text-right">{{ $movie->episode_current }}</span>
|
||||||
|
</a>
|
||||||
|
<div class="stui-vodlist__detail">
|
||||||
|
<h4 class="title text-overflow">
|
||||||
|
<a href="{{ $movie->getUrl() }}"
|
||||||
|
title="{{ $movie->name }}">{{ $movie->name }}</a>
|
||||||
|
</h4>
|
||||||
|
<p class="text text-overflow text-muted hidden-xs">{{ $movie->origin_name }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-wide-2 stui-pannel-side hidden-md hidden-sm hidden-xs">
|
||||||
|
<div class="col-pd stui-pannel-bg clearfix">
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
<div class="stui-pannel__head bottom-line active clearfix">
|
||||||
|
<h3 class="title"> Top tuần </h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_bd">
|
||||||
|
<ul class="stui-vodlist__media active col-pd clearfix">
|
||||||
|
@foreach ($item['top'] as $movie)
|
||||||
|
<li class="top-line-dot">
|
||||||
|
<div class="thumb">
|
||||||
|
<a class="stui-vodlist__thumb" href="{{ $movie->getUrl() }}"
|
||||||
|
title="{{ $movie->name }}"
|
||||||
|
style="width: 33.5px; background-image: url({{ $movie->getThumbUrl() }});"></a>
|
||||||
|
</div>
|
||||||
|
<div class="detail detail-side" style="padding-top: 5px;">
|
||||||
|
<p class="margin-0 text_single-line">
|
||||||
|
<a href="{{ $movie->getUrl() }}">{{ $movie->name }}</a>
|
||||||
|
</p>
|
||||||
|
<div class="score">
|
||||||
|
<div class="star">
|
||||||
|
<span class="star-cur" id="score"></span>
|
||||||
|
</div>
|
||||||
|
<span class="branch">{{ $movie->getRatingStar() }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
16
resources/views/themexingkong/inc/slider_recommended.blade.php
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
<div class="stui-pannel stui-pannel-bg clearfix">
|
||||||
|
<div class="stui-pannel-box clearfix">
|
||||||
|
<div class="stui-pannel-bd">
|
||||||
|
<div class="carousel carousel_default flickity-page">
|
||||||
|
@foreach ($recommendations as $movie)
|
||||||
|
<div class="col-xs-1">
|
||||||
|
<a href="{{ $movie->getUrl() }}" class="stui-vodlist__thumb banner" title="{{ $movie->name }}"
|
||||||
|
style="background: url({{ $movie->getPosterUrl() }}) no-repeat; background-position:50% 50%; background-size: cover;">
|
||||||
|
<span class="pic-text text-center">{{ $movie->name }}</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
85
resources/views/themexingkong/index.blade.php
Executable file
@ -0,0 +1,85 @@
|
|||||||
|
@extends('themes::themexingkong.layout')
|
||||||
|
|
||||||
|
|
||||||
|
@php
|
||||||
|
use VsMov\Core\Models\Movie;
|
||||||
|
$recommendations = Cache::remember('site.movies.recommendations', setting('site_cache_ttl', 5 * 60), function () {
|
||||||
|
return Movie::where('is_recommended', true)->limit(get_theme_option('recommendations_limit', 10))->orderBy('updated_at', 'desc')->get();
|
||||||
|
});
|
||||||
|
$data = Cache::remember('site.movies.latest', setting('site_cache_ttl', 5 * 60), function () {
|
||||||
|
$lists = preg_split('/[\n\r]+/', get_theme_option('latest'));
|
||||||
|
$data = [];
|
||||||
|
foreach ($lists as $list) {
|
||||||
|
if (trim($list)) {
|
||||||
|
$list = explode('|', $list);
|
||||||
|
[$label, $relation, $field, $val, $sortKey, $alg, $limit, $link, $template] = array_merge($list, ['Phim mới cập nhật', '', 'type', 'series', 'created_at', 'desc', 8, '/', 'default']);
|
||||||
|
try {
|
||||||
|
$top = null;
|
||||||
|
if ($template === 'with_top') {
|
||||||
|
$top = Movie::when($relation, function ($query) use ($relation, $field, $val) {
|
||||||
|
$query->whereHas($relation, function ($rel) use ($field, $val) {
|
||||||
|
$rel->where($field, $val);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
->when(!$relation, function ($query) use ($field, $val) {
|
||||||
|
$query->where($field, $val);
|
||||||
|
})
|
||||||
|
->orderBy('view_week', 'desc')
|
||||||
|
->limit(9)
|
||||||
|
->get();
|
||||||
|
}
|
||||||
|
$data[] = [
|
||||||
|
'label' => $label,
|
||||||
|
'data' => Movie::when($relation, function ($query) use ($relation, $field, $val) {
|
||||||
|
$query->whereHas($relation, function ($rel) use ($field, $val) {
|
||||||
|
$rel->where($field, $val);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
->when(!$relation, function ($query) use ($field, $val) {
|
||||||
|
$query->where($field, $val);
|
||||||
|
})
|
||||||
|
->orderBy($sortKey, $alg)
|
||||||
|
->limit($limit)
|
||||||
|
->get(),
|
||||||
|
'top' => $top,
|
||||||
|
'link' => $link ?: '#',
|
||||||
|
'template' => $template,
|
||||||
|
];
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $data;
|
||||||
|
});
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
@push('header')
|
||||||
|
<style type="text/css">
|
||||||
|
.stui-vodlist__thumb.banner {
|
||||||
|
padding-top: 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width:767px) {
|
||||||
|
.stui-vodlist__thumb.banner {
|
||||||
|
padding-top: 45%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
@include('themes::themexingkong.inc.slider_recommended')
|
||||||
|
|
||||||
|
@foreach ($data as $item)
|
||||||
|
@include('themes::themexingkong.inc.sections.' . $item['template'])
|
||||||
|
@endforeach
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(".score").each(function() {
|
||||||
|
var star = $(this).find(".branch").text().replace(".", "0.");
|
||||||
|
$(this).find("#score").css("width", "" + star + "%");
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
54
resources/views/themexingkong/layout.blade.php
Executable file
@ -0,0 +1,54 @@
|
|||||||
|
@extends('themes::layout')
|
||||||
|
|
||||||
|
@php
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
@push('header')
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
|
||||||
|
rel="stylesheet">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="{{ asset('themes/xingkong/css/iconfont.css') }}" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="{{ asset('themes/xingkong/css/stui_block.css') }}" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="{{ asset('themes/xingkong/css/stui_block_color.css') }}" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="{{ asset('themes/xingkong/css/stui_default.css') }}" type="text/css" />
|
||||||
|
|
||||||
|
<script type="text/javascript" src="{{ asset('themes/xingkong/js/jquery.min.js') }}"></script>
|
||||||
|
<script type="text/javascript" src="{{ asset('themes/xingkong/js/stui_default.js') }}"></script>
|
||||||
|
<script type="text/javascript" src="{{ asset('themes/xingkong/js/stui_block.js') }}"></script>
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
@section('body')
|
||||||
|
@include('themes::themexingkong.inc.header')
|
||||||
|
@if (get_theme_option('ads_header'))
|
||||||
|
<div class="container">
|
||||||
|
<div id="top-banner">
|
||||||
|
{!! get_theme_option('ads_header') !!}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
@yield('content')
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
@section('footer')
|
||||||
|
{!! get_theme_option('footer') !!}
|
||||||
|
|
||||||
|
@if (get_theme_option('ads_catfish'))
|
||||||
|
<div class="container">
|
||||||
|
<div id="catfish-banner">
|
||||||
|
{!! get_theme_option('ads_catfish') !!}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
{!! setting('site_scripts_google_analytics') !!}
|
||||||
|
@endsection
|
||||||
221
resources/views/themexingkong/single.blade.php
Executable file
@ -0,0 +1,221 @@
|
|||||||
|
@extends('themes::themexingkong.layout')
|
||||||
|
|
||||||
|
@php
|
||||||
|
$watch_url = '';
|
||||||
|
if (!$currentMovie->is_copyright && count($currentMovie->episodes) && $currentMovie->episodes[0]['link'] != '') {
|
||||||
|
$watch_url = $currentMovie->episodes
|
||||||
|
->sortBy([['server', 'asc']])
|
||||||
|
->groupBy('server')
|
||||||
|
->first()
|
||||||
|
->sortByDesc('name', SORT_NATURAL)
|
||||||
|
->groupBy('name')
|
||||||
|
->last()
|
||||||
|
->sortByDesc('type')
|
||||||
|
->first()
|
||||||
|
->getUrl();
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
@push('header')
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="col-lg-wide-8 col-xs-1 padding-0">
|
||||||
|
<div class="stui-pannel stui-pannel-bg clearfix">
|
||||||
|
<div class="stui-pannel-box clearfix">
|
||||||
|
<div class="stui-pannel_bd clearfix">
|
||||||
|
<div class="stui-content col-pd clearfix">
|
||||||
|
<div class="stui-content__thumb">
|
||||||
|
<a class="stui-vodlist__thumb picture v-thumb" href="{{ $watch_url }}"
|
||||||
|
title="{{ $currentMovie->name }}">
|
||||||
|
<img class="lazyload" src="{{ asset('themes/xingkong/img/load.gif') }}"
|
||||||
|
data-original="{{ $currentMovie->getThumbUrl() }}" />
|
||||||
|
<span class="play active hidden-xs"></span>
|
||||||
|
<span class="pic-text text-right">{{ $currentMovie->episode_current }}</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="stui-content__detail">
|
||||||
|
<h1 class="title">{{ $currentMovie->name }}</h1>
|
||||||
|
<p class="data">
|
||||||
|
<h2>{{ $currentMovie->origin_name }}</h2>
|
||||||
|
</p>
|
||||||
|
<p class="movie-rating">
|
||||||
|
<span id="movies-rating-star"></span>
|
||||||
|
</p>
|
||||||
|
<p class="data">
|
||||||
|
<span class="text-muted hidden-xs">Thể Loại: </span>
|
||||||
|
{!! $currentMovie->categories->map(function ($category) {
|
||||||
|
return '<a href="' . $category->getUrl() . '">' . $category->name . '</a>';
|
||||||
|
})->implode(', ') !!}
|
||||||
|
<span class="split-line"></span>
|
||||||
|
<span class="text-muted hidden-xs">Quốc gia: </span>
|
||||||
|
|
||||||
|
{!! $currentMovie->regions->map(function ($region) {
|
||||||
|
return '<a href="' . $region->getUrl() . '">' . $region->name . '</a>';
|
||||||
|
})->implode(', ') !!}
|
||||||
|
|
||||||
|
<span class="split-line"></span>
|
||||||
|
<span class="text-muted hidden-xs">Năm: </span>{{ $currentMovie->publish_year }}
|
||||||
|
</p>
|
||||||
|
<p class="data">
|
||||||
|
|
||||||
|
</p>
|
||||||
|
<p class="data">
|
||||||
|
<span class="text-muted">Ngôn ngữ: </span>{{ $currentMovie->language }} <span
|
||||||
|
class="split-line"></span>
|
||||||
|
<span class="text-muted hidden-xs">Chất lượng: </span>{{ $currentMovie->quality }}
|
||||||
|
</p>
|
||||||
|
<p class="data">
|
||||||
|
<span class="text-muted">Diễn viên: </span>
|
||||||
|
{!! $currentMovie->actors->map(function ($actor) {
|
||||||
|
return '<a href="' . $actor->getUrl() . '">' . $actor->name . '</a>';
|
||||||
|
})->implode(', ') !!}
|
||||||
|
</p>
|
||||||
|
<p class="data">
|
||||||
|
<span class="text-muted">Đạo diễn: </span>
|
||||||
|
{!! $currentMovie->directors->map(function ($director) {
|
||||||
|
return '<a href="' . $director->getUrl() . '">' . $director->name . '</a>';
|
||||||
|
})->implode(', ') !!}
|
||||||
|
</p>
|
||||||
|
<p class="desc detail hidden-xs">
|
||||||
|
<span class="left text-muted">Nội dung:</span>
|
||||||
|
<span class="detail-sketch">
|
||||||
|
{!! Str::limit(strip_tags($currentMovie->content), 60, '...') !!}
|
||||||
|
</span>
|
||||||
|
<span class="detail-content" style="display: none;">
|
||||||
|
{!! strip_tags($currentMovie->content) !!}
|
||||||
|
</span>
|
||||||
|
<a class="detail-more" href="javascript:;">Xem thêm <i
|
||||||
|
class="icon iconfont icon-moreunfold"></i>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<div class="play-btn clearfix">
|
||||||
|
<div class="share bdsharebuttonbox hidden-sm hidden-xs pull-right"></div>
|
||||||
|
@if ($watch_url)
|
||||||
|
<a class="btn btn-primary" href="{{ $watch_url }}">Xem Phim</a>
|
||||||
|
@endif
|
||||||
|
@if (strpos($currentMovie->trailer_url, 'youtube'))
|
||||||
|
<a href="javascript:void(0);" class="btn btn-default" id="show-trailer">Trailer</a>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if ($watch_url)
|
||||||
|
<div class="stui-pannel stui-pannel-bg clearfix">
|
||||||
|
<div class="stui-pannel-box b playlist mb">
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
<div class="stui-pannel__head bottom-line active clearfix">
|
||||||
|
<span class="more text-muted pull-right"></span>
|
||||||
|
<h3 class="title"> Xem phim {{ $currentMovie->name }} </h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_bd col-pd clearfix">
|
||||||
|
<ul class="stui-content__playlist clearfix">
|
||||||
|
@php
|
||||||
|
$currentMovie->episodes
|
||||||
|
->sortBy([['name', 'desc'], ['type', 'desc']])
|
||||||
|
->sortByDesc('name', SORT_NATURAL)
|
||||||
|
->unique('name')
|
||||||
|
->take(8)
|
||||||
|
->map(function ($episode) {
|
||||||
|
echo '<li><a href="' . $episode->getUrl() . '">Tập ' . $episode->name . '</a></li>';
|
||||||
|
});
|
||||||
|
@endphp
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@include('themes::themexingkong.inc.related_movie')
|
||||||
|
@include('themes::themexingkong.inc.comment')
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@include('themes::themexingkong.inc.right_bar')
|
||||||
|
|
||||||
|
@if (strpos($currentMovie->trailer_url, 'youtube'))
|
||||||
|
@php
|
||||||
|
try {
|
||||||
|
parse_str(parse_url($currentMovie->trailer_url, PHP_URL_QUERY), $parse_url);
|
||||||
|
$trailer_id = $parse_url['v'];
|
||||||
|
} catch (\Throwable $th) {
|
||||||
|
$trailer_id = '';
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
<div class="stui-modal fade" id="modal-trailer" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
|
||||||
|
aria-hidden="true">
|
||||||
|
<div class="stui-modal__dialog">
|
||||||
|
<div class="stui-modal__content">
|
||||||
|
<div class="stui-pannel clearfix">
|
||||||
|
<div class="stui-pannel-box clearfix">
|
||||||
|
<div class="stui-pannel_hd">
|
||||||
|
<div class="stui-pannel__head active bottom-line clearfix">
|
||||||
|
<a href="javascript:;" class="more close pull-right" data-dismiss="modal"
|
||||||
|
aria-hidden="true">
|
||||||
|
<i class="icon iconfont icon-close"></i>
|
||||||
|
</a>
|
||||||
|
<h3 class="title">Trailer phim {{ $currentMovie->name }}</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stui-pannel_bd clearfix">
|
||||||
|
<iframe src="https://www.youtube.com/embed/{{ $trailer_id }}"
|
||||||
|
style="width: 100%;height: 100%;" frameborder="0"
|
||||||
|
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
|
||||||
|
allowfullscreen></iframe>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
$("#show-trailer").click(function() {
|
||||||
|
$("#modal-trailer").modal('show');
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<script src="/themes/xingkong/plugins/jquery-raty/jquery.raty.js"></script>
|
||||||
|
<link href="/themes/xingkong/plugins/jquery-raty/jquery.raty.css" rel="stylesheet" type="text/css" />
|
||||||
|
<script>
|
||||||
|
var rated = false;
|
||||||
|
$('#movies-rating-star').raty({
|
||||||
|
score: {{ $currentMovie->getRatingStar() }},
|
||||||
|
number: 10,
|
||||||
|
numberMax: 10,
|
||||||
|
hints: ['quá tệ', 'tệ', 'không hay', 'không hay lắm', 'bình thường', 'xem được', 'có vẻ hay', 'hay',
|
||||||
|
'rất hay', 'siêu phẩm'
|
||||||
|
],
|
||||||
|
starOff: '/themes/xingkong/plugins/jquery-raty/images/star-off.png',
|
||||||
|
starOn: '/themes/xingkong/plugins/jquery-raty/images/star-on.png',
|
||||||
|
starHalf: '/themes/xingkong/plugins/jquery-raty/images/star-half.png',
|
||||||
|
click: function(score, evt) {
|
||||||
|
if (rated) return
|
||||||
|
fetch("{{ route('movie.rating', ['movie' => $currentMovie->slug]) }}", {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
'X-CSRF-TOKEN': document.querySelector(
|
||||||
|
'meta[name="csrf-token"]')
|
||||||
|
.getAttribute(
|
||||||
|
'content')
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
rating: score
|
||||||
|
})
|
||||||
|
});
|
||||||
|
rated = true;
|
||||||
|
$('#movies-rating-star').data('raty').readOnly(true);
|
||||||
|
alert(`Bạn đã đánh giá ${score} sao cho phim này!`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{!! setting('site_scripts_facebook_sdk') !!}
|
||||||
|
@endpush
|
||||||
53
routes/web.php
Executable file
@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Route;
|
||||||
|
use VsMov\ThemeXingKong\Controllers\ThemeXingKongController;
|
||||||
|
|
||||||
|
// --------------------------
|
||||||
|
// Custom Backpack Routes
|
||||||
|
// --------------------------
|
||||||
|
// This route file is loaded automatically by Backpack\Base.
|
||||||
|
// Routes you generate using Backpack\Generators will be placed here.
|
||||||
|
|
||||||
|
Route::group([
|
||||||
|
'middleware' => array_merge(
|
||||||
|
(array) config('backpack.base.web_middleware', 'web'),
|
||||||
|
),
|
||||||
|
], function () {
|
||||||
|
Route::get('/', [ThemeXingKongController::class, 'index']);
|
||||||
|
|
||||||
|
Route::get(setting('site_routes_category', '/the-loai/{category}'), [ThemeXingKongController::class, 'getMovieOfCategory'])
|
||||||
|
->where(['category' => '.+', 'id' => '[0-9]+'])
|
||||||
|
->name('categories.movies.index');
|
||||||
|
|
||||||
|
Route::get(setting('site_routes_region', '/quoc-gia/{region}'), [ThemeXingKongController::class, 'getMovieOfRegion'])
|
||||||
|
->where(['region' => '.+', 'id' => '[0-9]+'])
|
||||||
|
->name('regions.movies.index');
|
||||||
|
|
||||||
|
Route::get(setting('site_routes_tag', '/tu-khoa/{tag}'), [ThemeXingKongController::class, 'getMovieOfTag'])
|
||||||
|
->where(['tag' => '.+', 'id' => '[0-9]+'])
|
||||||
|
->name('tags.movies.index');
|
||||||
|
|
||||||
|
Route::get(setting('site_routes_types', '/danh-sach/{type}'), [ThemeXingKongController::class, 'getMovieOfType'])
|
||||||
|
->where(['type' => '.+', 'id' => '[0-9]+'])
|
||||||
|
->name('types.movies.index');
|
||||||
|
|
||||||
|
Route::get(setting('site_routes_actors', '/dien-vien/{actor}'), [ThemeXingKongController::class, 'getMovieOfActor'])
|
||||||
|
->where(['actor' => '.+', 'id' => '[0-9]+'])
|
||||||
|
->name('actors.movies.index');
|
||||||
|
|
||||||
|
Route::get(setting('site_routes_directors', '/dao-dien/{director}'), [ThemeXingKongController::class, 'getMovieOfDirector'])
|
||||||
|
->where(['director' => '.+', 'id' => '[0-9]+'])
|
||||||
|
->name('directors.movies.index');
|
||||||
|
|
||||||
|
Route::get(setting('site_routes_episode', '/phim/{movie}/{episode}-{id}'), [ThemeXingKongController::class, 'getEpisode'])
|
||||||
|
->where(['movie' => '.+', 'movie_id' => '[0-9]+', 'episode' => '.+', 'id' => '[0-9]+'])
|
||||||
|
->name('episodes.show');
|
||||||
|
|
||||||
|
Route::post(sprintf('/%s/{movie}/{episode}/report', config('vsmov.routes.movie', 'phim')), [ThemeXingKongController::class, 'reportEpisode'])->name('episodes.report');
|
||||||
|
Route::post(sprintf('/%s/{movie}/rate', config('vsmov.routes.movie', 'phim')), [ThemeXingKongController::class, 'rateMovie'])->name('movie.rating');
|
||||||
|
|
||||||
|
Route::get(setting('site_routes_movie', '/phim/{movie}'), [ThemeXingKongController::class, 'getMovieOverview'])
|
||||||
|
->where(['movie' => '.+', 'id' => '[0-9]+'])
|
||||||
|
->name('movies.show');
|
||||||
|
});
|
||||||
290
src/Controllers/ThemeXingKongController.php
Executable file
@ -0,0 +1,290 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace VsMov\ThemeXingKong\Controllers;
|
||||||
|
|
||||||
|
use Backpack\Settings\app\Models\Setting;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use VsMov\Core\Models\Actor;
|
||||||
|
use VsMov\Core\Models\Catalog;
|
||||||
|
use VsMov\Core\Models\Category;
|
||||||
|
use VsMov\Core\Models\Director;
|
||||||
|
use VsMov\Core\Models\Episode;
|
||||||
|
use VsMov\Core\Models\Movie;
|
||||||
|
use VsMov\Core\Models\Region;
|
||||||
|
use VsMov\Core\Models\Tag;
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
|
||||||
|
class ThemeXingKongController
|
||||||
|
{
|
||||||
|
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
if ($request['search'] || $request['filter']) {
|
||||||
|
$data = Movie::when(!empty($request['filter']['category']), function ($movie) {
|
||||||
|
$movie->whereHas('categories', function ($categories) {
|
||||||
|
$categories->where('id', request('filter')['category']);
|
||||||
|
});
|
||||||
|
})->when(!empty($request['filter']['region']), function ($movie) {
|
||||||
|
$movie->whereHas('regions', function ($regions) {
|
||||||
|
$regions->where('id', request('filter')['region']);
|
||||||
|
});
|
||||||
|
})->when(!empty($request['filter']['year']), function ($movie) {
|
||||||
|
$movie->where('publish_year', request('filter')['year']);
|
||||||
|
})->when(!empty($request['filter']['type']), function ($movie) {
|
||||||
|
$movie->where('type', request('filter')['type']);
|
||||||
|
})->when(!empty($request['search']), function ($query) {
|
||||||
|
$query->where(function ($query) {
|
||||||
|
$query->whereRaw("MATCH(name, origin_name) AGAINST(? IN BOOLEAN MODE)", [request('search')]);
|
||||||
|
});
|
||||||
|
})->when(!empty($request['filter']['sort']), function ($movie) {
|
||||||
|
if (request('filter')['sort'] == 'create') {
|
||||||
|
return $movie->orderBy('created_at', 'desc');
|
||||||
|
}
|
||||||
|
if (request('filter')['sort'] == 'update') {
|
||||||
|
return $movie->orderBy('updated_at', 'desc');
|
||||||
|
}
|
||||||
|
if (request('filter')['sort'] == 'year') {
|
||||||
|
return $movie->orderBy('publish_year', 'desc');
|
||||||
|
}
|
||||||
|
if (request('filter')['sort'] == 'view') {
|
||||||
|
return $movie->orderBy('view_total', 'desc');
|
||||||
|
}
|
||||||
|
})->paginate(get_theme_option('per_page_limit'));
|
||||||
|
|
||||||
|
return view('themes::themexingkong.catalog', [
|
||||||
|
'data' => $data,
|
||||||
|
'search' => $request['search'],
|
||||||
|
'section_name' => "Tìm kiếm phim: $request->search"
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
return view('themes::themexingkong.index', [
|
||||||
|
'title' => Setting::get('site_homepage_title')
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMovieOverview(Request $request)
|
||||||
|
{
|
||||||
|
/** @var Movie */
|
||||||
|
$movie = Movie::fromCache()->find($request->movie ?: $request->id);
|
||||||
|
|
||||||
|
if (is_null($movie)) abort(404);
|
||||||
|
|
||||||
|
$movie->generateSeoTags();
|
||||||
|
|
||||||
|
$movie->increment('view_total', 1);
|
||||||
|
$movie->increment('view_day', 1);
|
||||||
|
$movie->increment('view_week', 1);
|
||||||
|
$movie->increment('view_month', 1);
|
||||||
|
|
||||||
|
$movie_related_cache_key = 'movie_related:' . $movie->id;
|
||||||
|
$movie_related = Cache::get($movie_related_cache_key);
|
||||||
|
if (is_null($movie_related)) {
|
||||||
|
$movie_related = $movie->categories[0]->movies()->inRandomOrder()->limit(get_theme_option('movie_related_limit', 10))->get();
|
||||||
|
Cache::put($movie_related_cache_key, $movie_related, setting('site_cache_ttl', 5 * 60));
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('themes::themexingkong.single', [
|
||||||
|
'currentMovie' => $movie,
|
||||||
|
'title' => $movie->getTitle(),
|
||||||
|
'movie_related' => $movie_related
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getEpisode(Request $request)
|
||||||
|
{
|
||||||
|
$movie = Movie::fromCache()->find($request->movie ?: $request->movie_id)->load('episodes');
|
||||||
|
|
||||||
|
if (is_null($movie)) abort(404);
|
||||||
|
|
||||||
|
/** @var Episode */
|
||||||
|
$episode_id = $request->id;
|
||||||
|
$episode = $movie->episodes->when($episode_id, function ($collection, $episode_id) {
|
||||||
|
return $collection->where('id', $episode_id);
|
||||||
|
})->firstWhere('slug', $request->episode);
|
||||||
|
|
||||||
|
if (is_null($episode)) abort(404);
|
||||||
|
|
||||||
|
$episode->generateSeoTags();
|
||||||
|
|
||||||
|
$movie->increment('view_total', 1);
|
||||||
|
$movie->increment('view_day', 1);
|
||||||
|
$movie->increment('view_week', 1);
|
||||||
|
$movie->increment('view_month', 1);
|
||||||
|
|
||||||
|
$movie_related_cache_key = 'movie_related:' . $movie->id;
|
||||||
|
$movie_related = Cache::get($movie_related_cache_key);
|
||||||
|
if (is_null($movie_related)) {
|
||||||
|
$movie_related = $movie->categories[0]->movies()->inRandomOrder()->limit(get_theme_option('movie_related_limit', 10))->get();
|
||||||
|
Cache::put($movie_related_cache_key, $movie_related, setting('site_cache_ttl', 5 * 60));
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('themes::themexingkong.episode', [
|
||||||
|
'currentMovie' => $movie,
|
||||||
|
'movie_related' => $movie_related,
|
||||||
|
'episode' => $episode,
|
||||||
|
'title' => $episode->getTitle()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMovieOfCategory(Request $request)
|
||||||
|
{
|
||||||
|
/** @var Category */
|
||||||
|
$category = Category::fromCache()->find($request->category ?: $request->id);
|
||||||
|
|
||||||
|
if (is_null($category)) abort(404);
|
||||||
|
|
||||||
|
$category->generateSeoTags();
|
||||||
|
|
||||||
|
$movies = $category->movies()->orderBy('created_at', 'desc')->paginate(get_theme_option('per_page_limit'));
|
||||||
|
|
||||||
|
return view('themes::themexingkong.catalog', [
|
||||||
|
'data' => $movies,
|
||||||
|
'category' => $category,
|
||||||
|
'title' => $category->seo_title ?: $category->getTitle(),
|
||||||
|
'section_name' => "Phim thể loại $category->name"
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMovieOfRegion(Request $request)
|
||||||
|
{
|
||||||
|
/** @var Region */
|
||||||
|
$region = Region::fromCache()->find($request->region ?: $request->id);
|
||||||
|
|
||||||
|
if (is_null($region)) abort(404);
|
||||||
|
|
||||||
|
$region->generateSeoTags();
|
||||||
|
|
||||||
|
$movies = $region->movies()->orderBy('created_at', 'desc')->paginate(get_theme_option('per_page_limit'));
|
||||||
|
|
||||||
|
return view('themes::themexingkong.catalog', [
|
||||||
|
'data' => $movies,
|
||||||
|
'region' => $region,
|
||||||
|
'title' => $region->seo_title ?: $region->getTitle(),
|
||||||
|
'section_name' => "Phim quốc gia $region->name"
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMovieOfActor(Request $request)
|
||||||
|
{
|
||||||
|
/** @var Actor */
|
||||||
|
$actor = Actor::fromCache()->find($request->actor ?: $request->id);
|
||||||
|
|
||||||
|
if (is_null($actor)) abort(404);
|
||||||
|
|
||||||
|
$actor->generateSeoTags();
|
||||||
|
|
||||||
|
$movies = $actor->movies()->orderBy('created_at', 'desc')->paginate(get_theme_option('per_page_limit'));
|
||||||
|
|
||||||
|
return view('themes::themexingkong.catalog', [
|
||||||
|
'data' => $movies,
|
||||||
|
'person' => $actor,
|
||||||
|
'title' => $actor->getTitle(),
|
||||||
|
'section_name' => "Diễn viên $actor->name"
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMovieOfDirector(Request $request)
|
||||||
|
{
|
||||||
|
/** @var Director */
|
||||||
|
$director = Director::fromCache()->find($request->director ?: $request->id);
|
||||||
|
|
||||||
|
if (is_null($director)) abort(404);
|
||||||
|
|
||||||
|
$director->generateSeoTags();
|
||||||
|
|
||||||
|
$movies = $director->movies()->orderBy('created_at', 'desc')->paginate(get_theme_option('per_page_limit'));
|
||||||
|
|
||||||
|
return view('themes::themexingkong.catalog', [
|
||||||
|
'data' => $movies,
|
||||||
|
'person' => $director,
|
||||||
|
'title' => $director->getTitle(),
|
||||||
|
'section_name' => "Đạo diễn $director->name"
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMovieOfTag(Request $request)
|
||||||
|
{
|
||||||
|
/** @var Tag */
|
||||||
|
$tag = Tag::fromCache()->find($request->tag ?: $request->id);
|
||||||
|
|
||||||
|
if (is_null($tag)) abort(404);
|
||||||
|
|
||||||
|
$tag->generateSeoTags();
|
||||||
|
|
||||||
|
$movies = $tag->movies()->orderBy('created_at', 'desc')->paginate(get_theme_option('per_page_limit'));
|
||||||
|
return view('themes::themexingkong.catalog', [
|
||||||
|
'data' => $movies,
|
||||||
|
'tag' => $tag,
|
||||||
|
'title' => $tag->getTitle(),
|
||||||
|
'section_name' => "Tags: $tag->name"
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMovieOfType(Request $request)
|
||||||
|
{
|
||||||
|
/** @var Catalog */
|
||||||
|
$catalog = Catalog::fromCache()->find($request->type ?: $request->id);
|
||||||
|
|
||||||
|
if (is_null($catalog)) abort(404);
|
||||||
|
|
||||||
|
$catalog->generateSeoTags();
|
||||||
|
|
||||||
|
$cache_key = 'catalog:' . $catalog->id . ':page:' . ($request['page'] ?: 1);
|
||||||
|
$movies = Cache::get($cache_key);
|
||||||
|
if (is_null($movies)) {
|
||||||
|
$value = explode('|', trim($catalog->value));
|
||||||
|
[$relation_config, $field, $val, $sortKey, $alg] = array_merge($value, ['', 'is_copyright', 0, 'created_at', 'desc']);
|
||||||
|
$relation_config = explode(',', $relation_config);
|
||||||
|
|
||||||
|
[$relation_table, $relation_field, $relation_val] = array_merge($relation_config, ['', '', '']);
|
||||||
|
try {
|
||||||
|
$movies = \VsMov\Core\Models\Movie::when($relation_table, function ($query) use ($relation_table, $relation_field, $relation_val, $field, $val) {
|
||||||
|
$query->whereHas($relation_table, function ($rel) use ($relation_field, $relation_val, $field, $val) {
|
||||||
|
$rel->where($relation_field, $relation_val)->where(array_combine(explode(",", $field), explode(",", $val)));
|
||||||
|
});
|
||||||
|
})->when(!$relation_table, function ($query) use ($field, $val) {
|
||||||
|
$query->where(array_combine(explode(",", $field), explode(",", $val)));
|
||||||
|
})
|
||||||
|
->orderBy($sortKey, $alg)
|
||||||
|
->paginate($catalog->paginate);
|
||||||
|
|
||||||
|
Cache::put($cache_key, $movies, setting('site_cache_ttl', 5 * 60));
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('themes::themexingkong.catalog', [
|
||||||
|
'data' => $movies,
|
||||||
|
'section_name' => "Danh sách $catalog->name"
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function reportEpisode(Request $request, $movie, $slug)
|
||||||
|
{
|
||||||
|
$movie = Movie::fromCache()->find($movie)->load('episodes');
|
||||||
|
|
||||||
|
$episode = $movie->episodes->when(request('id'), function ($collection) {
|
||||||
|
return $collection->where('id', request('id'));
|
||||||
|
})->firstWhere('slug', $slug);
|
||||||
|
|
||||||
|
$episode->update([
|
||||||
|
'report_message' => request('message', ''),
|
||||||
|
'has_report' => true
|
||||||
|
]);
|
||||||
|
|
||||||
|
return response([], 204);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function rateMovie(Request $request, $movie)
|
||||||
|
{
|
||||||
|
|
||||||
|
$movie = Movie::fromCache()->find($movie);
|
||||||
|
|
||||||
|
$movie->refresh()->increment('rating_count', 1, [
|
||||||
|
'rating_star' => $movie->rating_star + ((int) request('rating') - $movie->rating_star) / ($movie->rating_count + 1)
|
||||||
|
]);
|
||||||
|
|
||||||
|
return response([], 204);
|
||||||
|
}
|
||||||
|
}
|
||||||
229
src/ThemeXingKongServiceProvider.php
Executable file
@ -0,0 +1,229 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace VsMov\ThemeXingKong;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
|
||||||
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
|
||||||
|
class ThemeXingKongServiceProvider extends ServiceProvider
|
||||||
|
{
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
$this->setupDefaultThemeCustomizer();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function boot()
|
||||||
|
{
|
||||||
|
$this->loadViewsFrom(__DIR__ . '/../resources/views/', 'themes');
|
||||||
|
|
||||||
|
$this->publishes([
|
||||||
|
__DIR__ . '/../resources/assets' => public_path('themes/xingkong')
|
||||||
|
], 'xingkong-assets');
|
||||||
|
|
||||||
|
view()->composer('themes::themexingkong.*', function ($view) {
|
||||||
|
$view->with('menu', \VsMov\Core\Models\Menu::getTree());
|
||||||
|
});
|
||||||
|
|
||||||
|
view()->composer(['themes::themexingkong.inc.right_bar'], function ($view) {
|
||||||
|
$tops = Cache::remember('site.movies.tops', setting('site_cache_ttl', 5 * 60), function () {
|
||||||
|
$lists = preg_split('/[\n\r]+/', get_theme_option('hotest'));
|
||||||
|
$data = [];
|
||||||
|
foreach ($lists as $list) {
|
||||||
|
if (trim($list)) {
|
||||||
|
$list = explode('|', $list);
|
||||||
|
[$label, $relation, $field, $val, $sortKey, $alg, $limit] = array_merge($list, ['Phim hot', '', 'type', 'series', 'view_total', 'desc', 4]);
|
||||||
|
try {
|
||||||
|
$data[] = [
|
||||||
|
'label' => $label,
|
||||||
|
'data' => \VsMov\Core\Models\Movie::when($relation, function ($query) use ($relation, $field, $val) {
|
||||||
|
$query->whereHas($relation, function ($rel) use ($field, $val) {
|
||||||
|
$rel->where($field, $val);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
->when(!$relation, function ($query) use ($field, $val) {
|
||||||
|
$query->where($field, $val);
|
||||||
|
})
|
||||||
|
->orderBy($sortKey, $alg)
|
||||||
|
->limit($limit)
|
||||||
|
->get(),
|
||||||
|
];
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
# code
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
});
|
||||||
|
$view->with('tops', $tops);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function setupDefaultThemeCustomizer()
|
||||||
|
{
|
||||||
|
config(['themes' => array_merge(config('themes', []), [
|
||||||
|
'xingkong' => [
|
||||||
|
'name' => 'Theme XingKong',
|
||||||
|
'author' => 'vsmov@gmail.com',
|
||||||
|
'package_name' => 'vsmov/theme-xingkong',
|
||||||
|
'publishes' => ['xingkong-assets'],
|
||||||
|
'preview_image' => '',
|
||||||
|
'options' => [
|
||||||
|
[
|
||||||
|
'name' => 'recommendations_limit',
|
||||||
|
'label' => 'Recommended movies limit',
|
||||||
|
'type' => 'number',
|
||||||
|
'value' => 10,
|
||||||
|
'wrapperAttributes' => [
|
||||||
|
'class' => 'form-group col-md-4',
|
||||||
|
],
|
||||||
|
'tab' => 'List'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'per_page_limit',
|
||||||
|
'label' => 'Pages limit',
|
||||||
|
'type' => 'number',
|
||||||
|
'value' => 30,
|
||||||
|
'wrapperAttributes' => [
|
||||||
|
'class' => 'form-group col-md-4',
|
||||||
|
],
|
||||||
|
'tab' => 'List'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'movie_related_limit',
|
||||||
|
'label' => 'Movies related limit',
|
||||||
|
'type' => 'number',
|
||||||
|
'value' => 12,
|
||||||
|
'wrapperAttributes' => [
|
||||||
|
'class' => 'form-group col-md-4',
|
||||||
|
],
|
||||||
|
'tab' => 'List'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'latest',
|
||||||
|
'label' => 'Home Page',
|
||||||
|
'type' => 'code',
|
||||||
|
'hint' => 'display_label|display_description|relation|find_by_field|value|sort_by_field|sort_algo|limit|show_more_url|section_template(default|with_top)',
|
||||||
|
'value' => <<<EOT
|
||||||
|
Phim chiếu rạp mới||is_shown_in_theater|1|created_at|desc|12|/danh-sach/phim-chieu-rap|default
|
||||||
|
Phim bộ mới||type|series|updated_at|desc|10|/danh-sach/phim-bo|with_top
|
||||||
|
Phim lẻ mới||type|single|updated_at|desc|10|/danh-sach/phim-le|with_top
|
||||||
|
Phim hoạt hình mới|categories|slug|hoat-hinh|updated_at|desc|10|/the-loai/hoat-hinh|with_top
|
||||||
|
EOT,
|
||||||
|
'attributes' => [
|
||||||
|
'rows' => 5
|
||||||
|
],
|
||||||
|
'tab' => 'List'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'hotest',
|
||||||
|
'label' => 'Danh sách hot',
|
||||||
|
'type' => 'code',
|
||||||
|
'hint' => 'Label|relation|find_by_field|value|sort_by_field|sort_algo|limit',
|
||||||
|
'value' => <<<EOT
|
||||||
|
Phim sắp chiếu||status|trailer|publish_year|desc|8
|
||||||
|
Top phim lẻ||type|single|view_week|desc|8
|
||||||
|
Top phim bộ||type|series|view_week|desc|8
|
||||||
|
EOT,
|
||||||
|
'attributes' => [
|
||||||
|
'rows' => 5
|
||||||
|
],
|
||||||
|
'tab' => 'List'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'additional_css',
|
||||||
|
'label' => 'Additional CSS',
|
||||||
|
'type' => 'code',
|
||||||
|
'value' => "",
|
||||||
|
'tab' => 'Custom CSS'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'body_attributes',
|
||||||
|
'label' => 'Body attributes',
|
||||||
|
'type' => 'text',
|
||||||
|
'value' => '',
|
||||||
|
'tab' => 'Custom CSS'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'additional_header_js',
|
||||||
|
'label' => 'Header JS',
|
||||||
|
'type' => 'code',
|
||||||
|
'value' => "",
|
||||||
|
'tab' => 'Custom JS'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'additional_body_js',
|
||||||
|
'label' => 'Body JS',
|
||||||
|
'type' => 'code',
|
||||||
|
'value' => "",
|
||||||
|
'tab' => 'Custom JS'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'additional_footer_js',
|
||||||
|
'label' => 'Footer JS',
|
||||||
|
'type' => 'code',
|
||||||
|
'value' => "",
|
||||||
|
'tab' => 'Custom JS'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'footer',
|
||||||
|
'label' => 'Footer',
|
||||||
|
'type' => 'code',
|
||||||
|
'value' => <<<EOT
|
||||||
|
<footer>
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="stui-foot clearfix">
|
||||||
|
<p class="text-center hidden-xs">
|
||||||
|
<a class="fed-font-xiv" href="#" target="_blank">Textlink</a>
|
||||||
|
<span class="fed-font-xiv"> - </span>
|
||||||
|
<a class="fed-font-xiv" href="#" target="_blank">Textlink</a>
|
||||||
|
<span class="fed-font-xiv fed-hide-xs"> - </span>
|
||||||
|
<a class="fed-font-xiv fed-hide-xs" href="#" target="_blank">Textlink</a>
|
||||||
|
<span class="fed-font-xiv fed-hide-xs"> - </span>
|
||||||
|
<a class="fed-font-xiv fed-hide-xs" href="#" target="_blank">Textlink</a>
|
||||||
|
<span class="fed-font-xiv fed-hide-xs"> - </span>
|
||||||
|
<a class="fed-font-xiv fed-hide-xs" href="#" target="_blank">Textlink</a>
|
||||||
|
<span class="fed-font-xiv fed-hide-xs"> - </span>
|
||||||
|
<a class="fed-font-xiv fed-hide-xs" href="#" target="_blank">Textlink</a>
|
||||||
|
<span class="fed-font-xiv fed-hide-xs"> - </span>
|
||||||
|
<a class="fed-font-xiv fed-hide-xs" href="#" target="_blank">Textlink</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="stui-foot clearfix">
|
||||||
|
<div class="col-pd text-center hidden-xs">
|
||||||
|
Dữ liệu phim miễn phí vĩnh viễn. Cập nhật nhanh, chất lượng cao, ổn định và lâu dài. Tốc độ phát cực nhanh với đường truyền băng thông cao, đảm bảo đáp ứng được lượng xem phim trực tuyến lớn. Đồng thời giúp nhà phát triển website phim giảm thiểu chi phí của các dịch vụ lưu trữ và stream.
|
||||||
|
</div>
|
||||||
|
<p class="share bdsharebuttonbox text-center margin-0 hidden-sm hidden-xs"></p>
|
||||||
|
<p class="text-muted text-center visible-xs">Copyright © 2015-2024 <a href="/" target="_blank">VsMov</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
EOT,
|
||||||
|
'tab' => 'Custom HTML'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'ads_header',
|
||||||
|
'label' => 'Ads header',
|
||||||
|
'type' => 'code',
|
||||||
|
'value' => <<<EOT
|
||||||
|
|
||||||
|
EOT,
|
||||||
|
'tab' => 'Ads'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'ads_catfish',
|
||||||
|
'label' => 'Ads catfish',
|
||||||
|
'type' => 'code',
|
||||||
|
'value' => <<<EOT
|
||||||
|
|
||||||
|
EOT,
|
||||||
|
'tab' => 'Ads'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
]
|
||||||
|
])]);
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
src/screenshot.png
Executable file
|
After Width: | Height: | Size: 615 KiB |