更新部署系统
This commit is contained in:
parent
88ae291fad
commit
8a7e9c59e9
36
.gitlab-ci.yml
Normal file
36
.gitlab-ci.yml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
variables:
|
||||||
|
APP_NAME: "surl"
|
||||||
|
IMAGE_NAME: "$APP_NAME:$CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA"
|
||||||
|
DOCKER_FILE_PATH: "./Dockerfile"
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- build
|
||||||
|
- clear
|
||||||
|
- deploy
|
||||||
|
|
||||||
|
build:
|
||||||
|
stage: build
|
||||||
|
image: docker:latest
|
||||||
|
services:
|
||||||
|
- name: docker:dind
|
||||||
|
tags:
|
||||||
|
- dockerbase
|
||||||
|
script:
|
||||||
|
- ls -a
|
||||||
|
- docker build -t ${IMAGE_NAME} -f ${DOCKER_FILE_PATH} .
|
||||||
|
|
||||||
|
clear:
|
||||||
|
stage: clear
|
||||||
|
tags:
|
||||||
|
- dockerbase
|
||||||
|
script:
|
||||||
|
- docker stop ${APP_NAME}
|
||||||
|
- docker rm ${APP_NAME}
|
||||||
|
allow_failure: true
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
stage: deploy
|
||||||
|
tags:
|
||||||
|
- dockerbase
|
||||||
|
script:
|
||||||
|
- docker run -t -d --name ${APP_NAME} -p 5008:80 ${IMAGE_NAME}
|
6
Dockerfile
Normal file
6
Dockerfile
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
FROM python:3.7-alpine
|
||||||
|
COPY requirements.txt /app/requirements.txt
|
||||||
|
WORKDIR /app
|
||||||
|
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||||||
|
COPY . .
|
||||||
|
CMD sh go.sh && python
|
2
go.sh
2
go.sh
@ -1,3 +1,3 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
echo start
|
echo start
|
||||||
gunicorn curl:app -c gunicorn.conf.py
|
gunicorn surl:app -c gunicorn.conf.py
|
0
logs/acess.log
Normal file
0
logs/acess.log
Normal file
0
logs/error.log
Normal file
0
logs/error.log
Normal file
23
requirements.txt
Normal file
23
requirements.txt
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
APScheduler==3.6.3
|
||||||
|
certifi==2019.11.28
|
||||||
|
chardet==3.0.4
|
||||||
|
Click==7.0
|
||||||
|
et-xmlfile==1.0.1
|
||||||
|
Flask==1.1.1
|
||||||
|
Flask-APScheduler==1.11.0
|
||||||
|
Flask-Cors==3.0.8
|
||||||
|
gunicorn==20.0.4
|
||||||
|
idna==2.8
|
||||||
|
itsdangerous==1.1.0
|
||||||
|
jdcal==1.4.1
|
||||||
|
Jinja2==2.10.3
|
||||||
|
MarkupSafe==1.1.1
|
||||||
|
pymongo==3.10.1
|
||||||
|
python-dateutil==2.8.1
|
||||||
|
pytz==2020.1
|
||||||
|
requests==2.22.0
|
||||||
|
six==1.14.0
|
||||||
|
soupsieve==1.9.5
|
||||||
|
tzlocal==2.1
|
||||||
|
urllib3==1.25.7
|
||||||
|
Werkzeug==0.16.0
|
20974
static/assets/css/blk-design-system.css
Normal file
20974
static/assets/css/blk-design-system.css
Normal file
File diff suppressed because it is too large
Load Diff
543
static/assets/css/nucleo-icons.css
Normal file
543
static/assets/css/nucleo-icons.css
Normal file
@ -0,0 +1,543 @@
|
|||||||
|
/* --------------------------------
|
||||||
|
|
||||||
|
Nucleo Outline Web Font - nucleoapp.com/
|
||||||
|
License - nucleoapp.com/license/
|
||||||
|
Created using IcoMoon - icomoon.io
|
||||||
|
|
||||||
|
-------------------------------- */
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Nucleo';
|
||||||
|
src: url('../fonts/nucleo.eot');
|
||||||
|
src: url('../fonts/nucleo.eot') format('embedded-opentype'), url('../fonts/nucleo.woff2') format('woff2'), url('../fonts/nucleo.woff') format('woff'), url('../fonts/nucleo.ttf') format('truetype'), url('../fonts/nucleo.svg') format('svg');
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------
|
||||||
|
base class definition
|
||||||
|
-------------------------*/
|
||||||
|
|
||||||
|
.tim-icons {
|
||||||
|
display: inline-block;
|
||||||
|
font: normal normal normal 1em/1 'Nucleo';
|
||||||
|
vertical-align: middle;
|
||||||
|
speak: none;
|
||||||
|
text-transform: none;
|
||||||
|
/* Better Font Rendering */
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-icon-detail {
|
||||||
|
text-align: center;
|
||||||
|
padding: 45px 0 30px;
|
||||||
|
border: 1px solid #e44cc4;
|
||||||
|
border-radius: .1875rem;
|
||||||
|
margin: 15px 0;
|
||||||
|
min-height: 168px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-icon-detail i {
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-icon-detail p {
|
||||||
|
color: #e44cc4 !important;
|
||||||
|
margin-top: 30px;
|
||||||
|
padding: 0 10px;
|
||||||
|
font-size: .7142em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------
|
||||||
|
change icon size
|
||||||
|
-------------------------*/
|
||||||
|
|
||||||
|
.tim-icons-sm {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tim-icons-lg {
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* absolute units */
|
||||||
|
|
||||||
|
.tim-icons-16 {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tim-icons-32 {
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------
|
||||||
|
add a square/circle background
|
||||||
|
-----------------------------------*/
|
||||||
|
|
||||||
|
.tim-icons-bg-square,
|
||||||
|
.tim-icons-bg-circle {
|
||||||
|
padding: 0.35em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tim-icons-bg-circle {
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------
|
||||||
|
list icons
|
||||||
|
-------------------------*/
|
||||||
|
|
||||||
|
/*------------------------
|
||||||
|
spinning icons
|
||||||
|
-------------------------*/
|
||||||
|
|
||||||
|
.tim-icons-is-spinning {
|
||||||
|
-webkit-animation: tim-icons-spin 2s infinite linear;
|
||||||
|
-moz-animation: tim-icons-spin 2s infinite linear;
|
||||||
|
animation: tim-icons-spin 2s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes tim-icons-spin {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@-moz-keyframes tim-icons-spin {
|
||||||
|
0% {
|
||||||
|
-moz-transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
-moz-transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes tim-icons-spin {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
-moz-transform: rotate(0deg);
|
||||||
|
-ms-transform: rotate(0deg);
|
||||||
|
-o-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
-moz-transform: rotate(360deg);
|
||||||
|
-ms-transform: rotate(360deg);
|
||||||
|
-o-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------
|
||||||
|
rotated/flipped icons
|
||||||
|
-------------------------*/
|
||||||
|
|
||||||
|
/*------------------------
|
||||||
|
icons
|
||||||
|
-------------------------*/
|
||||||
|
|
||||||
|
.icon-alert-circle-exc::before {
|
||||||
|
content: "\ea02";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-align-center::before {
|
||||||
|
content: "\ea03";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-align-left-2::before {
|
||||||
|
content: "\ea04";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-app::before {
|
||||||
|
content: "\ea05";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-atom::before {
|
||||||
|
content: "\ea06";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-attach-87::before {
|
||||||
|
content: "\ea07";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-badge::before {
|
||||||
|
content: "\ea08";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-bag-16::before {
|
||||||
|
content: "\ea09";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-bank::before {
|
||||||
|
content: "\ea0a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-basket-simple::before {
|
||||||
|
content: "\ea0b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-bell-55::before {
|
||||||
|
content: "\ea0c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-bold::before {
|
||||||
|
content: "\ea0d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-book-bookmark::before {
|
||||||
|
content: "\ea0e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-bulb-63::before {
|
||||||
|
content: "\ea0f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-bullet-list-67::before {
|
||||||
|
content: "\ea10";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-bus-front-12::before {
|
||||||
|
content: "\ea11";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-button-pause::before {
|
||||||
|
content: "\ea12";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-button-power::before {
|
||||||
|
content: "\ea13";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-calendar-60::before {
|
||||||
|
content: "\ea14";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-camera-18::before {
|
||||||
|
content: "\ea15";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-caps-small::before {
|
||||||
|
content: "\ea16";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-cart::before {
|
||||||
|
content: "\ea17";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-chart-bar-32::before {
|
||||||
|
content: "\ea18";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-chart-pie-36::before {
|
||||||
|
content: "\ea19";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-chat-33::before {
|
||||||
|
content: "\ea1a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-check-2::before {
|
||||||
|
content: "\ea1b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-cloud-download-93::before {
|
||||||
|
content: "\ea1c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-cloud-upload-94::before {
|
||||||
|
content: "\ea1d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-coins::before {
|
||||||
|
content: "\ea1e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-compass-05::before {
|
||||||
|
content: "\ea1f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-controller::before {
|
||||||
|
content: "\ea20";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-credit-card::before {
|
||||||
|
content: "\ea21";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-delivery-fast::before {
|
||||||
|
content: "\ea22";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-double-left::before {
|
||||||
|
content: "\ea23";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-double-right::before {
|
||||||
|
content: "\ea24";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-email-85::before {
|
||||||
|
content: "\ea25";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-gift-2::before {
|
||||||
|
content: "\ea26";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-globe-2::before {
|
||||||
|
content: "\ea27";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-headphones::before {
|
||||||
|
content: "\ea28";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-heart-2::before {
|
||||||
|
content: "\ea29";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-html5::before {
|
||||||
|
content: "\ea2a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-image-02::before {
|
||||||
|
content: "\ea2b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-istanbul::before {
|
||||||
|
content: "\ea2c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-key-25::before {
|
||||||
|
content: "\ea2d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-laptop::before {
|
||||||
|
content: "\ea2e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-light-3::before {
|
||||||
|
content: "\ea2f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-link-72::before {
|
||||||
|
content: "\ea30";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-lock-circle::before {
|
||||||
|
content: "\ea31";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-map-big::before {
|
||||||
|
content: "\ea32";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-minimal-down::before {
|
||||||
|
content: "\ea33";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-minimal-left::before {
|
||||||
|
content: "\ea34";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-minimal-right::before {
|
||||||
|
content: "\ea35";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-minimal-up::before {
|
||||||
|
content: "\ea36";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-mobile::before {
|
||||||
|
content: "\ea37";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-molecule-40::before {
|
||||||
|
content: "\ea38";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-money-coins::before {
|
||||||
|
content: "\ea39";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-notes::before {
|
||||||
|
content: "\ea3a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-palette::before {
|
||||||
|
content: "\ea3b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-paper::before {
|
||||||
|
content: "\ea3c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-pencil::before {
|
||||||
|
content: "\ea3d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-pin::before {
|
||||||
|
content: "\ea3e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-planet::before {
|
||||||
|
content: "\ea3f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-puzzle-10::before {
|
||||||
|
content: "\ea40";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-satisfied::before {
|
||||||
|
content: "\ea41";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-scissors::before {
|
||||||
|
content: "\ea42";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-send::before {
|
||||||
|
content: "\ea43";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-settings-gear-63::before {
|
||||||
|
content: "\ea44";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-settings::before {
|
||||||
|
content: "\ea45";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-simple-add::before {
|
||||||
|
content: "\ea46";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-simple-delete::before {
|
||||||
|
content: "\ea47";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-simple-remove::before {
|
||||||
|
content: "\ea48";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-single-02::before {
|
||||||
|
content: "\ea49";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-single-copy-04::before {
|
||||||
|
content: "\ea4a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-sound-wave::before {
|
||||||
|
content: "\ea4b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-spaceship::before {
|
||||||
|
content: "\ea4c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-square-pin::before {
|
||||||
|
content: "\ea4d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-support-17::before {
|
||||||
|
content: "\ea4e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tablet-2::before {
|
||||||
|
content: "\ea4f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tag::before {
|
||||||
|
content: "\ea50";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tap-02::before {
|
||||||
|
content: "\ea51";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tie-bow::before {
|
||||||
|
content: "\ea52";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-time-alarm::before {
|
||||||
|
content: "\ea53";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-trash-simple::before {
|
||||||
|
content: "\ea54";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-triangle-right-17::before {
|
||||||
|
content: "\ea55";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-trophy::before {
|
||||||
|
content: "\ea56";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tv-2::before {
|
||||||
|
content: "\ea57";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-upload::before {
|
||||||
|
content: "\ea58";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-user-run::before {
|
||||||
|
content: "\ea59";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-vector::before {
|
||||||
|
content: "\ea5a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-video-66::before {
|
||||||
|
content: "\ea5b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-volume-98::before {
|
||||||
|
content: "\ea5c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-wallet-43::before {
|
||||||
|
content: "\ea5d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-watch-time::before {
|
||||||
|
content: "\ea5e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-wifi::before {
|
||||||
|
content: "\ea5f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-world::before {
|
||||||
|
content: "\ea60";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zoom-split::before {
|
||||||
|
content: "\ea61";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-refresh-01::before {
|
||||||
|
content: "\ea62";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-refresh-02::before {
|
||||||
|
content: "\ea63";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-shape-star::before {
|
||||||
|
content: "\ea64";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-components::before {
|
||||||
|
content: "\ea65";
|
||||||
|
}
|
BIN
static/assets/fonts/nucleo.eot
Normal file
BIN
static/assets/fonts/nucleo.eot
Normal file
Binary file not shown.
BIN
static/assets/fonts/nucleo.ttf
Normal file
BIN
static/assets/fonts/nucleo.ttf
Normal file
Binary file not shown.
BIN
static/assets/fonts/nucleo.woff
Normal file
BIN
static/assets/fonts/nucleo.woff
Normal file
Binary file not shown.
BIN
static/assets/fonts/nucleo.woff2
Normal file
BIN
static/assets/fonts/nucleo.woff2
Normal file
Binary file not shown.
BIN
static/assets/img/dots.png
Normal file
BIN
static/assets/img/dots.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 184 KiB |
BIN
static/assets/img/favicon.ico
Normal file
BIN
static/assets/img/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
74
static/assets/js/blk-design-system.min.js
vendored
Normal file
74
static/assets/js/blk-design-system.min.js
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/*!
|
||||||
|
|
||||||
|
=========================================================
|
||||||
|
* BLK Design System- v1.0.0
|
||||||
|
=========================================================
|
||||||
|
|
||||||
|
* Product Page: https://www.creative-tim.com/product/blk-design-system
|
||||||
|
* Copyright 2019 Creative Tim (https://www.creative-tim.com)
|
||||||
|
* Licensed under MIT
|
||||||
|
|
||||||
|
* Coded by Creative Tim
|
||||||
|
|
||||||
|
=========================================================
|
||||||
|
|
||||||
|
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
*/
|
||||||
|
var big_image, navbar_initialized, transparent = !0,
|
||||||
|
transparentDemo = !0,
|
||||||
|
fixedTop = !1,
|
||||||
|
backgroundOrange = !1,
|
||||||
|
toggle_initialized = !1,
|
||||||
|
$datepicker = $(".datepicker"),
|
||||||
|
$collapse = $(".navbar .collapse"),
|
||||||
|
$html = $("html");
|
||||||
|
|
||||||
|
function hideNavbarCollapse(e) { e.addClass("collapsing-out") }
|
||||||
|
|
||||||
|
function hiddenNavbarCollapse(e) { e.removeClass("collapsing-out") }
|
||||||
|
|
||||||
|
function debounce(t, o, n) {
|
||||||
|
var r;
|
||||||
|
return function() {
|
||||||
|
var e = this,
|
||||||
|
a = arguments;
|
||||||
|
clearTimeout(r), r = setTimeout(function() { r = null, n || t.apply(e, a) }, o), n && !r && t.apply(e, a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function debounce(t, o, n) {
|
||||||
|
var r;
|
||||||
|
return function() {
|
||||||
|
var e = this,
|
||||||
|
a = arguments;
|
||||||
|
clearTimeout(r), r = setTimeout(function() { r = null, n || t.apply(e, a) }, o), n && !r && t.apply(e, a)
|
||||||
|
}
|
||||||
|
} - 1 < navigator.platform.indexOf("Win") ? (0 != $(".tab-content .table-responsive").length && $(".table-responsive").each(function() { new PerfectScrollbar($(this)[0]) }), $html.addClass("perfect-scrollbar-on")) : $html.addClass("perfect-scrollbar-off"), $(document).ready(function() {
|
||||||
|
$('[data-toggle="tooltip"], [rel="tooltip"]').tooltip(), $('[data-toggle="popover"]').each(function() { color_class = $(this).data("color"), $(this).popover({ template: '<div class="popover popover-' + color_class + '" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>' }) });
|
||||||
|
var a = document.getElementById("square1"),
|
||||||
|
t = document.getElementById("square2"),
|
||||||
|
o = document.getElementById("square3"),
|
||||||
|
n = document.getElementById("square4"),
|
||||||
|
r = document.getElementById("square5"),
|
||||||
|
l = document.getElementById("square6"),
|
||||||
|
s = document.getElementById("square7"),
|
||||||
|
i = document.getElementById("square8");
|
||||||
|
0 != $(".square").length && $(document).mousemove(function(e) { posX = event.clientX - window.innerWidth / 2, posY = event.clientY - window.innerWidth / 6, a.style.transform = "perspective(500px) rotateY(" + .05 * posX + "deg) rotateX(" + -.05 * posY + "deg)", t.style.transform = "perspective(500px) rotateY(" + .05 * posX + "deg) rotateX(" + -.05 * posY + "deg)", o.style.transform = "perspective(500px) rotateY(" + .05 * posX + "deg) rotateX(" + -.05 * posY + "deg)", n.style.transform = "perspective(500px) rotateY(" + .05 * posX + "deg) rotateX(" + -.05 * posY + "deg)", r.style.transform = "perspective(500px) rotateY(" + .05 * posX + "deg) rotateX(" + -.05 * posY + "deg)", l.style.transform = "perspective(500px) rotateY(" + .05 * posX + "deg) rotateX(" + -.05 * posY + "deg)", s.style.transform = "perspective(500px) rotateY(" + .02 * posX + "deg) rotateX(" + -.02 * posY + "deg)", i.style.transform = "perspective(500px) rotateY(" + .02 * posX + "deg) rotateX(" + -.02 * posY + "deg)" }), blackKit.initNavbarImage(), $navbar = $(".navbar[color-on-scroll]"), scroll_distance = $navbar.attr("color-on-scroll") || 500, 0 != $(".navbar[color-on-scroll]").length && (blackKit.checkScrollForTransparentNavbar(), $(window).on("scroll", blackKit.checkScrollForTransparentNavbar)), $(".form-control").on("focus", function() { $(this).parent(".input-group").addClass("input-group-focus") }).on("blur", function() { $(this).parent(".input-group").removeClass("input-group-focus") }), $(".bootstrap-switch").each(function() { $this = $(this), data_on_label = $this.data("on-label") || "", data_off_label = $this.data("off-label") || "", $this.bootstrapSwitch({ onText: data_on_label, offText: data_off_label }) }), $(".carousel").carousel({ interval: !1 })
|
||||||
|
}), $collapse.length && ($collapse.on({ "hide.bs.collapse": function() { hideNavbarCollapse($collapse) } }), $collapse.on({ "hidden.bs.collapse": function() { hiddenNavbarCollapse($collapse) } })), $(document).on("click", ".navbar-toggler", function() { $toggle = $(this), 1 == blackKit.misc.navbar_menu_visible ? ($("html").removeClass("nav-open"), blackKit.misc.navbar_menu_visible = 0, $("#bodyClick").remove(), setTimeout(function() { $toggle.removeClass("toggled") }, 550)) : (setTimeout(function() { $toggle.addClass("toggled") }, 580), div = '<div id="bodyClick"></div>', $(div).appendTo("body").click(function() { $("html").removeClass("nav-open"), blackKit.misc.navbar_menu_visible = 0, setTimeout(function() { $toggle.removeClass("toggled"), $("#bodyClick").remove() }, 550) }), $("html").addClass("nav-open"), blackKit.misc.navbar_menu_visible = 1) }), blackKit = {
|
||||||
|
misc: { navbar_menu_visible: 0 },
|
||||||
|
checkScrollForTransparentNavbar: debounce(function() { $(document).scrollTop() > scroll_distance ? transparent && (transparent = !1, $(".navbar[color-on-scroll]").removeClass("navbar-transparent")) : transparent || (transparent = !0, $(".navbar[color-on-scroll]").addClass("navbar-transparent")) }, 17),
|
||||||
|
initNavbarImage: function() {
|
||||||
|
var e = $(".navbar").find(".navbar-translate").siblings(".navbar-collapse"),
|
||||||
|
a = e.data("nav-image");
|
||||||
|
$(window).width() < 991 || $("body").hasClass("burger-menu") ? null != a && e.css("background", "url('" + a + "')").removeAttr("data-nav-image").css("background-size", "cover").addClass("has-image") : null != a && e.css("background", "").attr("data-nav-image", "" + a).css("background-size", "").removeClass("has-image")
|
||||||
|
},
|
||||||
|
initDatePicker: function() { 0 != $datepicker.length && $datepicker.datetimepicker({ icons: { time: "tim-icons icon-watch-time", date: "tim-icons icon-calendar-60", up: "fa fa-chevron-up", down: "fa fa-chevron-down", previous: "tim-icons icon-minimal-left", next: "tim-icons icon-minimal-right", today: "fa fa-screenshot", clear: "fa fa-trash", close: "fa fa-remove" } }) },
|
||||||
|
initSliders: function() {
|
||||||
|
var e = document.getElementById("sliderRegular");
|
||||||
|
0 != $("#sliderRegular").length && noUiSlider.create(e, { start: 40, connect: [!0, !1], range: { min: 0, max: 100 } });
|
||||||
|
var a = document.getElementById("sliderDouble");
|
||||||
|
0 != $("#sliderDouble").length && noUiSlider.create(a, { start: [20, 60], connect: !0, range: { min: 0, max: 100 } })
|
||||||
|
}
|
||||||
|
};
|
||||||
|
//# sourceMappingURL=_site_kit_free/assets/js/kit-free.js.map
|
7
static/assets/js/bootstrap.min.js
vendored
Normal file
7
static/assets/js/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
7
static/assets/js/clipboard.min.js
vendored
Normal file
7
static/assets/js/clipboard.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
4
static/assets/js/jquery.min.js
vendored
Normal file
4
static/assets/js/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
61
static/assets/js/main.js
Normal file
61
static/assets/js/main.js
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
=========================================================
|
||||||
|
* PT短网址- v1.0.0
|
||||||
|
=========================================================
|
||||||
|
* Product Page: https://github.com/xuhuai66/pt-dwz
|
||||||
|
* Copyright 2020 Xuhuai (https://www.zhai78.com)
|
||||||
|
* Coded by Xuhuai
|
||||||
|
*/
|
||||||
|
|
||||||
|
function initial() {
|
||||||
|
document.getElementById('copyLink').innerText = '复制链接';
|
||||||
|
$('#resultBox').css('display', 'none');
|
||||||
|
$('#desBox').css('display', 'block');
|
||||||
|
$('#loadingBox').css('display', 'block');
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkUrl(url, type) {
|
||||||
|
var url_test = /^(http|https):\/\/.*$/i.test(url);
|
||||||
|
if (!url_test) {
|
||||||
|
document.getElementById('errTip').innerText = '链接有误请检查后再提交';
|
||||||
|
$('#errPop').modal('show');
|
||||||
|
} else {
|
||||||
|
fetch(window.location.origin + '/insert', {
|
||||||
|
body: JSON.stringify({url}), // must match 'Content-Type' header
|
||||||
|
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
|
||||||
|
credentials: 'same-origin', // include, same-origin, *omit
|
||||||
|
headers: {
|
||||||
|
'user-agent': 'Mozilla/4.0 MDN Example',
|
||||||
|
'content-type': 'application/json'
|
||||||
|
},
|
||||||
|
method: 'POST', // *GET, POST, PUT, DELETE, etc.
|
||||||
|
mode: 'cors', // no-cors, cors, *same-origin
|
||||||
|
redirect: 'follow', // manual, *follow, error
|
||||||
|
referrer: 'no-referrer', // *client, no-referrer
|
||||||
|
}).then(response => response.json()).then(res => {
|
||||||
|
initial()
|
||||||
|
$('#loadingBox').css('display', 'none');
|
||||||
|
document.getElementById('resultLink').innerText = window.location.origin + '/' + res.tail
|
||||||
|
$('#resultBox').css('display', 'block');
|
||||||
|
$('#desBox').css('display', 'none');
|
||||||
|
}).catch(err => {
|
||||||
|
console.log(err)
|
||||||
|
document.getElementById('errTip').innerText = '转换失败';
|
||||||
|
$('#errPop').modal('show');
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setBoard() {
|
||||||
|
var clipboard = new ClipboardJS("#copyLink");
|
||||||
|
clipboard.on("success", function(element) { //复制成功的回调
|
||||||
|
document.getElementById('copyLink').innerText = '复制成功';
|
||||||
|
console.info("复制成功,复制内容: " + element.text);
|
||||||
|
});
|
||||||
|
clipboard.on("error", function(element) { //复制失败的回调
|
||||||
|
console.info(element);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$(function() {
|
||||||
|
setBoard();
|
||||||
|
});
|
4
static/assets/js/popper.min.js
vendored
Normal file
4
static/assets/js/popper.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -11,7 +11,7 @@ CORS(app, resources=r'/*')
|
|||||||
|
|
||||||
@app.route('/')
|
@app.route('/')
|
||||||
def base():
|
def base():
|
||||||
return 'Hello! Glad to serve you.'
|
return render_template('index.html')
|
||||||
|
|
||||||
@app.route('/insert',methods=['POST'])
|
@app.route('/insert',methods=['POST'])
|
||||||
def insert():
|
def insert():
|
223
templates/index.html
Normal file
223
templates/index.html
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
<!--
|
||||||
|
=========================================================
|
||||||
|
* PT短网址- v1.0.0
|
||||||
|
=========================================================
|
||||||
|
* Product Page: https://www.zhai78.com
|
||||||
|
* Copyright 2020 Xuhuai (https://www.zhai78.com)
|
||||||
|
* Coded by Xuhuai
|
||||||
|
-->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no,user-scalable=no">
|
||||||
|
<title>Lacus · 短网址</title>
|
||||||
|
<meta name="keywords" content="短链接生成,lacus,lacus短网址,短网址">
|
||||||
|
<meta name="description" content="Lacus · 短网址 - 免费的短网址生成">
|
||||||
|
<meta property="og:description" content="Lacus · 短网址 - 免费的短网址生成">
|
||||||
|
<meta property="og:type" content="acticle">
|
||||||
|
<meta property="og:locale" content="zh-CN" />
|
||||||
|
<meta property="og:site_name" content="Lacus · 短网址">
|
||||||
|
<meta property="og:title" content="Lacus · 短网址">
|
||||||
|
<link rel="shortcut icon" href="/static/assets/img/favicon.ico" />
|
||||||
|
<!-- 标题 -->
|
||||||
|
<meta itemprop="name" content="Lacus · 短网址" />
|
||||||
|
<!-- 描述 -->
|
||||||
|
<meta itemprop="description" content="简单、好用的短网址生成" />
|
||||||
|
<!-- 图片 -->
|
||||||
|
<meta itemprop="image" content="/static/assets/img/favicon.ico" />
|
||||||
|
|
||||||
|
<!-- Fonts and icons -->
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Poppins:200,300,400,600,700,800" rel="stylesheet" />
|
||||||
|
<link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.13.1/css/all.min.css" rel="stylesheet">
|
||||||
|
<!-- Nucleo Icons -->
|
||||||
|
<link href="/static/assets/css/nucleo-icons.css" rel="stylesheet" />
|
||||||
|
<!-- CSS Files -->
|
||||||
|
<link href="/static/assets/css/blk-design-system.css?v=1.0.0" rel="stylesheet" />
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="index-page">
|
||||||
|
<!-- Navbar -->
|
||||||
|
<nav class="navbar navbar-expand-lg fixed-top navbar-transparent " color-on-scroll="100">
|
||||||
|
<div class="container">
|
||||||
|
<div class="navbar-translate">
|
||||||
|
<a class="navbar-brand" href="#">
|
||||||
|
<span>Lacus •</span> 短网址
|
||||||
|
</a>
|
||||||
|
<button class="navbar-toggler navbar-toggler" type="button" data-toggle="collapse"
|
||||||
|
data-target="#navigation" aria-controls="navigation-index" aria-expanded="false"
|
||||||
|
aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-bar bar1"></span>
|
||||||
|
<span class="navbar-toggler-bar bar2"></span>
|
||||||
|
<span class="navbar-toggler-bar bar3"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="collapse navbar-collapse justify-content-end" id="navigation">
|
||||||
|
<div class="navbar-collapse-header">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-6 collapse-brand">
|
||||||
|
<a>
|
||||||
|
Lacus • 短网址
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="col-6 collapse-close text-right">
|
||||||
|
<button type="button" class="navbar-toggler" data-toggle="collapse"
|
||||||
|
data-target="#navigation" aria-controls="navigation-index" aria-expanded="false"
|
||||||
|
aria-label="Toggle navigation">
|
||||||
|
<i class="tim-icons icon-simple-remove"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ul class="navbar-nav">
|
||||||
|
<li class="nav-item p-0">
|
||||||
|
<a class="nav-link" rel="tooltip" title="Join us on QQ" data-placement="bottom"
|
||||||
|
href="https://jq.qq.com/?_wv=1027&k=j1yE6Nbv" target="_blank">
|
||||||
|
<i class="fab fa-qq"></i>
|
||||||
|
<p class="d-lg-none d-xl-none">QQ</p>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<!-- <li class="nav-item p-0">
|
||||||
|
<a class="nav-link" rel="tooltip" title="Like us on Github" data-placement="bottom" href="https://github.com/xuhuai66" target="_blank">
|
||||||
|
<i class="fab fa-github" aria-hidden="true"></i>
|
||||||
|
<p class="d-lg-none d-xl-none">github</p>
|
||||||
|
</a>
|
||||||
|
</li> -->
|
||||||
|
<li class="nav-item p-0">
|
||||||
|
<a class="nav-link" rel="tooltip" title="Follow us on Blog" data-placement="bottom"
|
||||||
|
href="https://lacus.site" target="_blank">
|
||||||
|
<i class="fa fa-heart" aria-hidden="true"></i>
|
||||||
|
<p class="d-lg-none d-xl-none">Blog</p>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link btn btn-default d-none d-lg-block" href="https://github.com/xuhuai66/pt-dwz"
|
||||||
|
target="_blank">
|
||||||
|
<i class="tim-icons icon-cloud-download-93"></i> Download
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<!-- BODY -->
|
||||||
|
<div class="wrapper">
|
||||||
|
<div class="page-header header-filter">
|
||||||
|
<div class="squares square1"></div>
|
||||||
|
<div class="squares square2"></div>
|
||||||
|
<div class="squares square3"></div>
|
||||||
|
<div class="squares square4"></div>
|
||||||
|
<div class="squares square5"></div>
|
||||||
|
<div class="squares square6"></div>
|
||||||
|
<div class="squares square7"></div>
|
||||||
|
<div class="container">
|
||||||
|
<div class="content-center brand">
|
||||||
|
<div class="loading_box" id="loadingBox" style="display:none">
|
||||||
|
<div class="loadingio-spinner-bean-eater-ogu3728vrsb">
|
||||||
|
<div class="ldio-0phfhqfdnuhi">
|
||||||
|
<div>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card card-profile shadow mb-0">
|
||||||
|
<div class="h1 text-neutral my-3">Lacus · 短网址</div>
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="input-group ">
|
||||||
|
<div class="input-group-prepend ">
|
||||||
|
<span class="input-group-text "><i class="fa fa-link"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" id="inputContent" class="form-control " placeholder="请输入需要转换的连接">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="justify-content-between row mx-0 px-3 mb-2">
|
||||||
|
<button class="btn btn-primary col-12" type="button"
|
||||||
|
onclick="checkUrl(document.getElementById('inputContent').value,'toShort')"
|
||||||
|
data-container="body" data-animation="true" title="将长链接还原成短链接">马 上 缩 短</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row justify-content-center mx-0 px-2 col-12" id='resultBox' style="display:none">
|
||||||
|
<div class="text-center col-12">
|
||||||
|
<div class="h4 text-success my-3">转换结果</div>
|
||||||
|
<h4 class="description" id="resultLink"></h4>
|
||||||
|
</div>
|
||||||
|
<div class="text-center mb-3 col-12">
|
||||||
|
<div class="btn btn-primary btn-round" id="copyLink" data-clipboard-target="#resultLink"
|
||||||
|
data-clipboard-action="copy"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<footer class="footer">
|
||||||
|
<div class="container">
|
||||||
|
<div class="col-12 h4 text-neutral text-center">
|
||||||
|
短网址由用户生成,所跳转的内容与本站无关。本站严禁钓鱼,诈骗等一切违法犯罪网站使用,如有发现立刻拉黑封停
|
||||||
|
</div>
|
||||||
|
<div class="col-12 text-center">
|
||||||
|
<p>Copyright © 2020 <a href="https://lacus.site/">Rain Sun</a></p>
|
||||||
|
<p><a href="http://beian.miit.gov.cn" target='_blank'> 吉ICP备18005655号</a> • Email:<a
|
||||||
|
href="mailto:zhaoyingbo@live.cn">zhaoyingbo@live.cn</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
<!--错误提示框-->
|
||||||
|
|
||||||
|
<div class="modal fade" id="errPop" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header justify-content-center">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
|
||||||
|
<i class="tim-icons icon-simple-remove"></i>
|
||||||
|
</button>
|
||||||
|
<h4 class="title title-up">温馨提示</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body text-center">
|
||||||
|
<p id="errTip"></p>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-primary col-12" data-dismiss="modal">确 定</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Core JS Files -->
|
||||||
|
<script src="/static/assets/js/jquery.min.js"></script>
|
||||||
|
<script src="/static/assets/js/popper.min.js" type="text/javascript"></script>
|
||||||
|
<script src="/static/assets/js/bootstrap.min.js"></script>
|
||||||
|
<script src="/static/assets/js/blk-design-system.min.js?v=1.0.0" type="text/javascript"></script>
|
||||||
|
<script src="/static/assets/js/clipboard.min.js"></script>
|
||||||
|
<script type="text/javascript" src="/static/assets/js/main.js"></script>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
blackKit.initDatePicker();
|
||||||
|
blackKit.initSliders();
|
||||||
|
});
|
||||||
|
|
||||||
|
function scrollToDownload() {
|
||||||
|
if ($('.section-download').length != 0) {
|
||||||
|
$("html, body").animate({
|
||||||
|
scrollTop: $('.section-download').offset().top
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
Loading…
x
Reference in New Issue
Block a user