feat: 初始化导航网站项目

添加 Flask 导航站应用,包含 Docker 部署配置、SQLite 数据库、静态资源及 CI/CD 流水线。
这个提交包含在:
2026-08-21 16:36:08 +08:00
当前提交 bff5252ff5
共修改 326 个文件,包含 138697 行新增和 0 行删除
+48
查看文件
@@ -0,0 +1,48 @@
/* analytics.css */
.ui.masthead.segment {
min-height: 300px;
}
.ui.masthead h1.ui.header {
margin-top: 1.5em;
}
.ui.masthead h2.ui.header {
margin-bottom: 1.5em;
}
.ui.vertical.stripe .ui.statistic .label {
font-size: 1.2em;
}
.echart-container {
height: 400px;
}
#visit-hourly.echart-container {
height: 600px;
}
#visit-map.echart-container {
height: 600px;
}
#visit-calendar.echart-container {
height: 940px;
}
@media only screen and (max-width: 767px) {
.ui.masthead.segment {
min-height: 160px;
}
.echart-container {
height: 300px;
}
#visit-hourly.echart-container {
height: 400px;
}
#visit-map.echart-container {
height: 400px;
}
#visit-calendar.echart-container {
height: 5710px;
}
}
+235
查看文件
@@ -0,0 +1,235 @@
/* common.css */
.ui.hidden.menu {
display: none;
}
.logo-image {
width: 30px;
}
.logo-text {
margin-left: 10px;
font-size: 1.6em;
font-weight: normal;
display: inline-block;
vertical-align: middle;
}
.ui.masthead.segment {
padding: 1em 0em;
z-index: 1;
}
.ui.masthead h1.ui.header {
font-size: 3em;
font-weight: normal;
}
.ui.masthead h2.ui.header {
font-size: 1.7em;
font-weight: normal;
}
.ui.vertical.stripe {
padding: 8em 0em;
}
.ui.vertical.stripe .horizontal.divider {
margin: 3em 0em;
}
.ui.links.stripe.segment,
.ui.stats.stripe.segment,
.ui.qrcode.stripe.segment {
padding: 0em;
}
.ui.stats.stripe.segment .grid .column {
padding-top: 3em;
padding-bottom: 3em;
}
.ui.qrcode.stripe.segment .grid .column {
padding-top: 5em;
padding-bottom: 5em;
}
.ui.stackable.celled.grid .row .links.column .ui.top.attached.label {
border-radius: 0;
}
.ui.footer.segment {
padding: 5em 0em;
}
.ui.borderless.inverted.menu {
border-radius: 0;
}
.ui.borderless.inverted.menu .toc.item {
display: none;
border-radius: 0;
}
@media only screen and (max-width: 767px) {
.ui.fixed.menu {
display: none !important;
}
.ui.borderless.inverted.menu .item,
.ui.borderless.inverted.menu .menu {
display: none;
}
.ui.borderless.inverted.menu .toc.item {
display: block;
}
.ui.masthead h1.ui.header {
margin-top: 1em;
font-size: 1.8em;
}
.ui.masthead h2.ui.header {
margin-bottom: 1em;
font-size: 1.5em;
}
.ui.stripe.segment {
padding: 2em 0em;
}
.ui.stats.stripe.segment {
padding: 0em;
}
}
/* text colors */
.text-red {
color: #DB2828;
}
.text-orange {
color: #F2711C;
}
.text-yellow {
color: #FBBD08;
}
.text-olive {
color: #B5CC18;
}
.text-green {
color: #21BA45;
}
.text-teal {
color: #00B5AD;
}
.text-blue {
color: #2185D0;
}
.text-violet {
color: #6435C9;
}
.text-purple {
color: #A333C8;
}
.text-pink {
color: #E03997;
}
.text-brown {
color: #A5673F;
}
.text-grey {
color: #767676;
}
.text-black {
color: #1B1C1D;
}
.text-white {
color: #FFF;
}
/* text colors inverted */
.text-red-inverted {
color: #FF695E;
}
.text-orange-inverted {
color: #FF851B;
}
.text-yellow-inverted {
color: #FFE21F;
}
.text-olive-inverted {
color: #D9E778;
}
.text-green-inverted {
color: #2ECC40;
}
.text-teal-inverted {
color: #6DFFFF;
}
.text-blue-inverted {
color: #54C8FF;
}
.text-violet-inverted {
color: #A291FB;
}
.text-purple-inverted {
color: #DC73FF;
}
.text-pink-inverted {
color: #FF8EDF;
}
.text-brown-inverted {
color: #D67C1C;
}
.text-grey-inverted {
color: #DCDDDE;
}
.text-black-inverted {
color: #545454;
}
/* background colors */
.background-red {
background-color: #DB2828;
}
.background-orange {
background-color: #F2711C;
}
.background-yellow {
background-color: #FBBD08;
}
.background-olive {
background-color: #B5CC18;
}
.background-green {
background-color: #21BA45;
}
.background-teal {
background-color: #00B5AD;
}
.background-blue {
background-color: #2185D0;
}
.background-violet {
background-color: #6435C9;
}
.background-purple {
background-color: #A333C8;
}
.background-pink {
background-color: #E03997;
}
.background-brown {
background-color: #A5673F;
}
.background-grey {
background-color: #767676;
}
.background-black {
background-color: #1B1C1D;
}
.background-white {
background-color: #FFF;
}
code {
padding: 0 5px;
white-space: nowrap;
border: 1px solid #EAEAEA;
background-color: #F8F8F8;
border-radius: 3px;
}
+23
查看文件
@@ -0,0 +1,23 @@
/* customize.css */
.ui.masthead.segment {
min-height: 300px;
}
.ui.masthead h1.ui.header {
margin-top: 1.5em;
}
.ui.masthead h2.ui.header {
margin-bottom: 1.5em;
}
.ui.vertical.stripe .ui.statistic .label {
font-size: 1.2em;
}
@media only screen and (max-width: 767px) {
.ui.masthead.segment {
min-height: 160px;
}
}
+28
查看文件
@@ -0,0 +1,28 @@
/* donate.css */
.ui.masthead.segment {
min-height: 300px;
}
.ui.masthead h1.ui.header {
margin-top: 1.5em;
}
.ui.masthead h2.ui.header {
margin-bottom: 1.5em;
}
.ui.vertical.stripe p {
font-size: 1.33em;
}
.ui.centered.card .qrcode.image {
padding: 1em;
background: none;
}
@media only screen and (max-width: 767px) {
.ui.masthead.segment {
min-height: 160px;
}
}
+26
查看文件
@@ -0,0 +1,26 @@
/* error.css */
.ui.masthead.segment {
min-height: 300px;
}
.ui.masthead h1.ui.header {
margin-top: 1.5em;
}
.ui.masthead h2.ui.header {
margin-bottom: 1.5em;
}
.ui.vertical.stripe h1.ui.error.header {
font-size: 8em;
}
@media only screen and (max-width: 767px) {
.ui.masthead.segment {
min-height: 160px;
}
.ui.vertical.stripe h1.ui.error.header {
font-size: 4em;
}
}
+12
查看文件
@@ -0,0 +1,12 @@
/* grayscale.css */
html {
filter: grayscale(85%) saturate(80%);
-webkit-filter: grayscale(85%) saturate(80%);
-moz-filter: grayscale(85%) saturate(80%);
-ms-filter: grayscale(85%) saturate(80%);
-o-filter: grayscale(85%) saturate(80%);
filter: url(data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><filter id="grayscale"><feColorMatrix type="matrix" values="0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"/></filter></svg>#grayscale);
filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=.85);
-webkit-filter: grayscale(.85) saturate(.8);
}
+74
查看文件
@@ -0,0 +1,74 @@
/* home.css */
.ui.masthead.segment {
padding: 1em 0em;
}
.ui.masthead .logo.item img {
margin-right: 1em;
}
.ui.masthead .ui.text.container {
margin-top: 15rem;
margin-bottom: 10rem;
}
.ui.masthead div.ui.pointing.label {
margin-bottom: 2em;
}
.ui.masthead h1.ui.header {
margin-top: 0em;
margin-bottom: 0em;
}
.ui.masthead h1.ui.logo.header .ui.centered.image {
margin-left: auto;
margin-right: auto;
}
.ui.masthead #search-shortcuts .ui.hidden.label {
display: none;
}
.ui.masthead #badges {
margin-top: 0.5rem;
}
.ui.masthead .ui.selection.link.list {
margin-top: 0em;
margin-bottom: 0.25em;
}
.ui.labels .ui.label {
margin-left: 0.25em;
margin-right: 0.25em;
}
.ui.masthead #banner-advertisement {
margin-bottom: 0.5em;
}
@media only screen and (max-width: 767px) {
.ui.masthead .ui.text.container {
margin-top: 2rem;
margin-bottom: 2rem;
}
.ui.masthead h1.ui.header {
margin-top: 0em;
font-size: 2em;
}
.ui.masthead h2.ui.header {
margin-top: 0.5em;
font-size: 1.5em;
}
}
/* index */
.ui .grid-item-full{
width: 100%;
}
.ui .grid-item{
width: 33%;
box-shadow: 0.5px 0.51px 0.5px 1px #dfdada;
}
+131
查看文件
@@ -0,0 +1,131 @@
/* masthead.css */
.ui.inverted.masthead.segment.zoomed h1.ui.header,
.ui.inverted.masthead.segment.zoomed h2.ui.header {
text-shadow: 0px 0px 4px rgba(0, 0, 0, 0);
color: rgba(255, 255, 255, 1);
}
.ui.inverted.masthead.segment.zoomed:after {
opacity: 0;
}
.ui.inverted.masthead.segment.zoomed {
background-color: #1B1C1D;
}
.ui.inverted.masthead.segment {
position: relative;
text-align: center;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 0px;
border-bottom: none;
background-color: #1B1C1D;
background-position: 50% 50%;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.ui.inverted.masthead.segment:after {
position: absolute;
top: 0px;
left: 0px;
z-index: -1;
width: 100%;
height: 100%;
content: '';
background-size: cover;
opacity: 0.45;
}
.ui.inverted.masthead.segment.bg1:after {
background-image: url('/static/images/backgrounds/1.jpg');
}
.ui.inverted.masthead.segment.bg2:after {
background-image: url('/static/images/backgrounds/2.jpg');
}
.ui.inverted.masthead.segment.bg3:after {
background-image: url('/static/images/backgrounds/3.jpg');
}
.ui.inverted.masthead.segment.bg4:after {
background-image: url('/static/images/backgrounds/4.jpg');
}
.ui.inverted.masthead.segment.bg5:after {
background-image: url('/static/images/backgrounds/5.jpg');
}
.ui.inverted.masthead.segment.bg6:after {
background-image: url('/static/images/backgrounds/6.jpg');
}
.ui.inverted.masthead.segment.bg7:after {
background-image: url('/static/images/backgrounds/7.jpg');
}
.ui.inverted.masthead.segment.bg8:after {
background-image: url('/static/images/backgrounds/8.jpg');
}
.ui.inverted.masthead.segment.bg9:after {
background-image: url('/static/images/backgrounds/9.jpg');
}
.ui.inverted.masthead.segment.bg10:after {
background-image: url('/static/images/backgrounds/10.jpg');
}
.ui.inverted.masthead.segment.bg11:after {
background-image: url('/static/images/backgrounds/11.jpg');
}
.ui.inverted.masthead.segment.bg12:after {
background-image: url('/static/images/backgrounds/12.jpg');
}
.ui.inverted.masthead.segment.bg13:after {
background-image: url('/static/images/backgrounds/13.jpg');
}
.ui.inverted.masthead.segment.bg14:after {
background-image: url('/static/images/backgrounds/14.jpg');
}
.ui.inverted.masthead.segment.bg15:after {
background-image: url('/static/images/backgrounds/15.jpg');
}
.ui.inverted.masthead.segment.bg16:after {
background-image: url('/static/images/backgrounds/16.jpg');
}
.ui.inverted.masthead.segment.bg17:after {
background-image: url('/static/images/backgrounds/17.jpg');
}
.ui.inverted.masthead.segment,
.ui.inverted.masthead.segment:after {
-ms-transition:
background 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s,
opacity 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s;
-moz-transition:
background 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s,
opacity 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s;
-webkit-transition:
background 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s,
opacity 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s;
transition:
background 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s,
opacity 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s;
transition:
background 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s,
opacity 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s;
-ms-transition:
background 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s,
opacity 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s;
-moz-transition:
background 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s,
opacity 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s;
-webkit-transition:
background 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s,
opacity 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s;
transition:
background 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s,
opacity 6s cubic-bezier(0.680, -0.550, 0.265, 1.4) 0s;
}
.pusher .ui.inverted.menu {
background: none;
}
.ui.masthead h1.ui.header:not(.logo) {
text-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2);
-moz-transform-style: preserve-3d;
-webkit-transform-style: preserve-3d;
transform-style: preserve-3d;
}
.ui.masthead h2.ui.header {
text-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2);
-moz-transform-style: preserve-3d;
-webkit-transform-style: preserve-3d;
transform-style: preserve-3d;
}
+26
查看文件
@@ -0,0 +1,26 @@
/* search.css */
.ui.masthead.segment {
min-height: 300px;
}
.ui.masthead h1.ui.header {
margin-top: 1.5em;
}
.ui.masthead h2.ui.header {
margin-bottom: 1.5em;
}
.ui.vertical.stripe h1.ui.search.header {
font-size: 8em;
}
@media only screen and (max-width: 767px) {
.ui.masthead.segment {
min-height: 160px;
}
.ui.vertical.stripe h1.ui.search.header {
font-size: 4em;
}
}