ismism/ismism.ts/ui/index.html
2022-09-05 15:21:11 +08:00

1150 lines
36 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<title>主义主义 活动公示</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="x-icon" href="https://img1.imgtp.com/2022/09/05/j3NGnLps.ico">
</head>
<style>
:root {
--cl-white: #fff;
--cl-light-gray: #f1f1f1;
--cl-gray: #9e9e9e;
--cl-dark-gray: #616161;
--cl-black: #000;
--cl-pale-red: #ffdddd;
--cl-red: #f44336;
--cl-amber: #ffc107;
--cl-purple: #673ab7;
--small: 12px;
--normal: 15px;
--large: 18px;
--w-max: 1400px;
--w-rpd: 720px;
--w-max-content: 960px;
--w-min-content: 320px;
}
.light-gray {
color: var(--cl-black) !important;
border-color: var(--cl-black) !important;
background-color: var(--cl-light-gray) !important;
}
.gray {
color: var(--cl-white) !important;
border-color: var(--cl-gray) !important;
background-color: var(--cl-gray) !important;
}
.dark-gray {
color: var(--cl-white) !important;
border-color: var(--cl-dark-gray) !important;
background-color: var(--cl-dark-gray) !important;
}
.black {
color: var(--cl-white) !important;
border-color: var(--cl-black) !important;
background-color: var(--cl-black) !important;
}
.pale-red {
color: var(--cl-black) !important;
border-color: var(--cl-pale-red) !important;
background-color: var(--cl-pale-red) !important;
}
.red {
color: var(--cl-white) !important;
border-color: var(--cl-red) !important;
background-color: var(--cl-red) !important;
}
.amber {
color: var(--cl-black) !important;
border-color: var(--cl-amber) !important;
background-color: var(--cl-amber) !important;
}
.purple {
color: var(--cl-white) !important;
border-color: var(--cl-purple) !important;
background-color: var(--cl-purple) !important;
}
html {
box-sizing: border-box;
overflow-x: hidden;
}
body {
margin: 0;
color: var(--cl-black);
background: var(--cl-light-gray);
font-family: Verdana, sans-serif;
font-size: var(--normal);
line-height: 1.5;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: 400;
margin: 10px 0
}
h1 {
font-size: 36px
}
h2 {
font-size: 30px
}
h3 {
font-size: 24px
}
h4 {
font-size: 20px
}
h5 {
font-size: 18px
}
h6 {
font-size: 16px
}
hr {
box-sizing: content-box;
height: 0;
border: 0;
border-top: 1px solid #eee;
overflow: visible;
margin: 20px 0;
}
code {
font-family: monospace;
font-size: 1em;
}
a {
color: inherit;
text-decoration: none;
}
header {
padding-top: 32px;
padding-bottom: 16px;
max-width: var(--w-max);
margin-left: auto;
margin-right: auto;
text-align: center;
}
header>.tag {
margin: 16px 32px;
}
.tag>a {
border-width: 1px;
border-style: solid;
border-radius: 6px;
margin-right: 6px;
margin-bottom: 6px;
color: var(--cl-black);
border-color: var(--cl-black);
background-color: var(--cl-light-gray);
}
.tag>a>span:nth-child(2) {
display: inline-block;
padding: 0.1em 8px;
margin-left: 0.75ch;
text-align: center;
border-radius: 50%;
font-size: var(--small);
color: var(--cl-white);
background-color: var(--cl-black);
}
.tag>a,
button {
display: inline-block;
padding: 5px 10px;
vertical-align: middle;
overflow: hidden;
text-decoration: none;
text-align: center;
cursor: pointer;
white-space: nowrap;
user-select: none;
color: inherit;
background-color: inherit;
}
button {
border: none;
}
button:hover,
.tag>a:hover {
color: var(--cl-white) !important;
border-color: var(--cl-dark-gray) !important;
background-color: var(--cl-dark-gray) !important;
opacity: 0.7;
}
.banner {
position: relative;
padding: 0.01em 16px;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12)
}
.banner>button {
font-size: var(--large);
}
.topright {
position: absolute;
right: 0;
top: 0
}
.content {
display: flex;
flex-flow: row wrap;
justify-content: center;
margin-left: auto;
margin-right: auto;
max-width: var(--w-max);
min-width: var(--w-min-content);
}
@media (max-width: 960px) {
.content>.main,
.content>.side {
width: 100%;
}
}
@media (min-width:960px) {
.content>.main {
flex-basis: var(--w-rpd);
flex-grow: 3;
}
.content>.side {
flex-basis: var(--w-min-content);
flex-grow: 1;
}
}
.content>.main>article {
margin: 16px !important;
padding-bottom: 10px;
color: var(--cl-black);
background: var(--cl-white);
box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.2), 0 4px 20px 0 rgba(0, 0, 0, 0.19);
}
.content>.main>article>section {
padding: 0.01em 16px;
margin: 10px 0;
}
.content .title>a {
display: inline-block;
font-size: 24px;
font-weight: bold;
margin: 10px 0;
}
.content .title>a>code {
font-weight: normal;
color: var(--cl-light-gray);
background-color: var(--cl-dark-gray);
padding: 0.1em 8px;
border-radius: 4px;
text-align: center
}
.content .date {
color: var(--cl-dark-gray);
font-size: var(--small);
font-family: monospace;
font-style: italic;
margin: 10px 0;
}
.content .photo {
color: var(--cl-dark-gray);
text-align: center;
width: auto;
}
.content .photo>div {
display: flex;
flex-flow: row wrap;
align-items: center;
text-align: center;
border-top: 1px dotted var(--cl-dark-gray);
padding: 10px 0;
}
@media (max-width: 720px) {
.content .photo>div>span {
width: 100%;
}
}
@media (min-width: 720px) {
.content .photo>div>span {
flex-basis: 180px;
flex-grow: 1;
}
.content .photo>div>span:nth-child(1) {
text-align: left;
}
.content .photo>div>span:nth-child(2) {
text-align: center;
}
.content .photo>div>span:nth-child(3) {
text-align: right;
}
}
.content .photo button {
padding: 0;
font-size: 1em;
}
.content .photo button:nth-child(1):after {
content: "/";
margin: 0 5px;
}
.content .photo img {
width: 100%;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
}
.content .stat {
--fund: 7000;
--budget: 7000;
--expense: 3500;
}
.content .stat>.bar>.label {
overflow: auto;
}
.content .stat>.bar>.label>*:nth-child(1) {
float: left;
}
.content .stat>.bar>.label>*:nth-child(2) {
float: right;
}
.content .stat>.bar>.label>a {
text-decoration: underline;
}
.content .stat>.bar>.label>a:hover {
color: var(--cl-amber);
}
.content .stat>.bar>div:nth-child(2) {
margin: 5px 0;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12)
}
.content .stat>.bar>div:nth-child(2)>div {
position: relative;
width: 100%;
color: var(--cl-black);
background-color: var(--cl-light-gray);
font-family: monospace;
overflow: hidden;
}
.content .stat>.bar>div:nth-child(2)>div>span {
display: inline-block;
position: absolute;
padding: 0.25em 8px;
left: 0;
top: 0;
width: 100%;
font-size: var(--normal);
margin: -1px 0;
min-width: 1ch;
}
.content .stat>.bar>div:nth-child(2)>div>span:nth-child(1) {
position: relative;
background-color: var(--cl-gray);
}
.content .stat>.bar>div:nth-child(2)>div.fund>span:nth-child(1) {
width: calc(var(--fund) / var(--budget) * 100%);
}
.content .stat>.bar>div:nth-child(2)>div.expense>span:nth-child(1) {
width: calc(var(--expense) / var(--budget) * 100%);
}
.content .stat>.bar>div:nth-child(2)>div>span:nth-child(2) {
text-align: center;
background: none;
}
.content .stat>.bar>div:nth-child(2)>div>span:nth-child(3) {
text-align: right;
background: none;
left: -16px;
}
.content .stat>.circle {
display: flex;
flex-flow: row wrap;
justify-content: center;
text-align: center;
--pct: 65;
}
.content .stat>.circle>div {
flex-basis: 1px;
flex-grow: 1;
display: flex;
flex-flow: column nowrap;
align-items: center;
margin: 10px;
font-size: var(--large);
}
.content .stat>.circle>div>div {
--size: 4em;
width: var(--size);
height: var(--size);
margin-bottom: 10px;
border-radius: 50%;
display: grid;
place-items: center;
background:
radial-gradient(closest-side, var(--cl-white) 66%, transparent 0 100%),
conic-gradient(var(--cl-gray) calc(var(--pct) * 1%), var(--cl-light-gray) 0);
font-family: monospace;
font-size: calc(var(--size) / 2);
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
color: var(--cl-amber);
text-shadow: 0 2px 2px var(--cl-light-gray);
}
.tab {
display: flex;
flex-flow: row wrap;
justify-content: center;
}
.tab>button {
margin: 0 3px;
font-size: var(--normal);
}
.tab>button>span {
display: inline-block;
background: var(--cl-black);
color: var(--cl-white);
padding: 0.1em 8px;
text-align: center
}
.log {
background: var(--cl-light-gray);
border-radius: 16px;
padding: 16px 8px;
margin-top: 16px;
max-height: 480px;
overflow-y: scroll;
}
.log>span {
display: block;
width: 100%;
margin: 8px 0;
color: var(--cl-gray);
text-align: center;
}
.log>div {
display: flex;
flex-flow: row nowrap;
margin: 16px 0;
}
.log>div>div:nth-child(1) {
display: flex;
flex-shrink: 0;
width: 48px;
height: 48px;
color: var(--cl-white);
background: var(--cl-gray);
border-radius: 50%;
font-size: 24px;
justify-content: center;
align-items: center;
}
.log>div>div:nth-child(2) {
display: flex;
flex-flow: column nowrap;
margin-left: 16px;
margin-right: 8px;
}
.log>div>div:nth-child(2)>div:nth-child(1) {
display: flex;
flex-flow: row wrap;
align-items: center;
}
.log>div>div:nth-child(2)>div:nth-child(1)>span {
display: inline-block;
font-size: var(--small);
background: var(--cl-dark-gray);
color: var(--cl-white);
padding: 0.1em 8px;
text-align: center;
margin: 1px;
user-select: none;
white-space: nowrap;
}
.log>div>div:nth-child(2)>div:nth-child(1)>span:nth-child(1) {
margin-left: 0.8ch;
}
.log>div>div:nth-child(2)>div:nth-child(2) {
font-size: var(--small);
font-style: italic;
color: var(--cl-gray);
}
.log>div>div:nth-child(2)>div:nth-child(3) {
min-width: 120px;
margin-top: 6px;
padding: 0.5em 16px;
background-color: var(--cl-light-gray);
border-radius: 0 8px 8px 8px;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
}
.log>div>div:nth-child(2)>div:nth-child(3)>a {
text-decoration: underline;
}
.log>div>div:nth-child(2)>div:nth-child(3)>a:hover {
color: var(--cl-amber);
}
.log.recent {
max-height: 100%;
}
footer {
padding: 32px 16px;
margin-top: 16px;
color: var(--cl-gray);
background: var(--cl-dark-gray);
text-align: center;
}
footer>a {
display: inline-flex;
align-items: center;
justify-content: center;
}
footer>a>img {
height: 1.2em;
margin-right: 0.2em;
}
footer>span {
display: block;
margin-top: 8px;
font-size: var(--small);
font-family: monospace;
}
.animate-left {
position: relative;
animation: animateleft 0.4s
}
@keyframes animateleft {
from {
left: -300px;
opacity: 0
}
to {
left: 0;
opacity: 1
}
}
.animate-right {
position: relative;
animation: animateright 0.4s
}
@keyframes animateright {
from {
right: -300px;
opacity: 0
}
to {
right: 0;
opacity: 1
}
}
.animate-opacity {
position: relative;
animation: animateopacity 0.4s;
}
@keyframes animateopacity {
from {
transform: scale(0.25);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
}
</style>
<template id="tag-item">
<a><span></span><span></span></a>
<a class="dark-gray"><span></span><span></span></a>
</template>
<template id="circle-item">
<div>
<div style="--pct: 65">65%</div>
<span>目标</span>
</div>
<div>
<div style="--pct: 100; color: var(--cl-gray)">完成</div>
<span>目标</span>
</div>
</template>
<template id="badge-item">
<span>badge</span>
</template>
<template id="video-link">
<a href="" target="_blank" rel="noopener">标题</a>
</template>
<template id="log-item">
<span>123 条日志</span>
<div>
<div>u</div>
<div>
<div>username <span>badge1</span><span>badge2</span></div>
<div>timestamp</div>
<div>msg</div>
</div>
</div>
</template>
<template id="article">
<article>
<section class="title">
<a><code>#0</code> <span>标题</span></a>
<div class="tag"></div>
<div class="date">公示时间:<span></span><br>更新时间:<span></span></div>
</section>
<section class="photo animate-opacity">
<div>
<span>图片标题</span>
<span><button>上一张</button><button>下一张</button></span>
<span><span>1</span>张 / 共<span>6</span></span>
</div>
<img />
</section>
<section class="stat animate-opacity">
<div class="bar">
<div class="label">
<span>收到支持</span>
<span>预算(元)</span>
</div>
<div>
<div class="fund">
<span>123456</span>
<span>50%</span>
<span>123456</span>
</div>
<div class="expense">
<span>12345</span>
<span>25%</span>
</div>
</div>
<div class="label">
<span>当前支出</span>
<a target="_blank" rel="noopener" href="https://docs.qq.com/sheet/DZU1qaWRsUnJJU1Z1">查看明细</a>
</div>
</div>
<div><br>活动目标:</div>
<div class="circle"></div>
</section>
<section class="msg">
<div class="tab">
<button><span>123</span> 条活动日志 </button>
<button><span>123</span> 名参与者 </button>
<button><span>123</span> 位支持者 </button>
</div>
<div class="log"></div>
<div class="log"></div>
<div class="log"></div>
</section>
</article>
</template>
<body>
<div class="banner dark-gray animate-right">
<button onclick="this.parentElement.style.display='none'" class="dark-gray topright">&times;</button>
<h3>提示!</h3>
<p>网站开发中。当前页面皆为测试内容。</p>
</div>
<header class="animate-left">
<a href="">
<h1><b>主义主义 <span style="color: var(--cl-red)">活动</span>公示</b></h1>
</a>
<hr>
<div class="tag"></div>
</header>
<div class="content animate-right">
<div class="main"></div>
<div class="side">
<div class="log recent"></div>
</div>
</div>
<footer class="animate-left">
<a href="https://space.bilibili.com/23191782" target="_blank" rel="noopener"><img
src="https://www.bilibili.com/favicon.ico">未明子</a> ·
<a href="https://space.bilibili.com/19147010" target="_blank" rel="noopener"><img
src="https://www.bilibili.com/favicon.ico">张正午</a>
<span>网站维护seven.two.eight@outlook.com</span>
</footer>
</body>
<script>
let hash = ""
const tags = [
"",
"进行中",
"已结束",
"设施建设",
"物资配给",
"软件开发",
"苏州",
"杭州",
"成都",
"星星家园",
"主义主义网站"
]
function etag(
el, tags, ct = false
) {
el.innerHTML = ""
const item = document.getElementById("tag-item").content.children
for (let t of tags) {
const a = el.appendChild(item[t == hash ? 1 : 0].cloneNode(true))
const s = a.getElementsByTagName("span")
a.href = `#${t}`
s[0].innerText = t.length == 0 ? "全部公示" : t
if (ct) s[1].innerText = articles.filter(p => t.length == 0 || p.tag.includes(t)).length
else s[1].style.display = "none"
}
}
const articles = [
{
aid: 2,
title: "星星家园改造",
tag: ["已结束", "设施建设", "苏州", "星星家园"],
date: { pub: "2022-09-05 07:28", update: "2022-09-05 07:28" },
img: [
{ title: "墙面施工", src: "https://img1.imgtp.com/2022/08/30/kk0PLIlC.jpg" },
{ title: "防水涂层", src: "https://img1.imgtp.com/2022/08/30/AxvEND6h.jpg" },
{ title: "堆放点", src: "https://img1.imgtp.com/2022/08/30/hDH79lFo.jpg" },
{ title: "平面图", src: "https://img1.imgtp.com/2022/08/30/TjxiIeeg.jpg" },
{ title: "庭院", src: "https://img1.imgtp.com/2022/08/30/mfqTjt9n.jpg" },
{ title: "室内", src: "https://img1.imgtp.com/2022/08/30/ymN6Lziv.jpg" },
],
nimg: 0,
stat: {
fund: 9130, budget: 9130, expense: 9130,
detail: "https://docs.qq.com/sheet/DZU1qaWRsUnJJU1Z1",
progress: [
{ goal: "卫生间改造", pct: 100 },
{ goal: "教室改造", pct: 100 },
{ goal: "庭院改造", pct: 100 },
]
},
participant: [
{ date: "2022-07-24", uid: "未明子", badge: ["发起人", "星星家园"], msg: "作为发起人参与活动" },
{ date: "2022-07-24", uid: "张正午", badge: ["发起人", "星星家园"], msg: "作为发起人参与活动" },
{ date: "2022-08-21", uid: "张东冬", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "盛航航", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "刘源", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "许沛洋", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "张恒光", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "李思源", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "朱宏基", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "郑昊", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "应一楷", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "田浩楠", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "孙陆钧", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "张洲", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "刘叙辰", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "庞哲昊", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "燕少昕", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "胡明达", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "张成昊", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "陆毅", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "辛子豪", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "马琳娜", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "梁卫天", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "沙名轩", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "纪培煜", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "斯通", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "陆一帜", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "张济达", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "曹子函", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "张明明", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "张超培", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "谢宇", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "蔡思忘", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "**匿名用户**", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
{ date: "2022-08-21", uid: "赵贺", badge: ["参与者", "星星家园"], msg: "作为施工者参与活动" },
],
activity: [
{ date: "2022-08-04 14:35", uid: "张正午", badge: ["发起人", "参与者", "星星家园"], msg: "工人子弟晚托班苏州星星家园环境改造/伙食改善公益项目工作记录", video: "https://www.bilibili.com/video/BV1zT411L7JP" },
{ date: "2022-08-04 22:17", uid: "未明子", badge: ["发起人", "参与者", "星星家园"], msg: "【现实行动】我们目前的一个行动项目", video: "https://www.bilibili.com/video/BV1xG4y1v7MV" },
{ date: "2022-08-17 00:37", uid: "未明子", badge: ["发起人", "参与者", "星星家园"], msg: "【项目跟踪】晚托班项目硬装计划介绍", video: "https://www.bilibili.com/video/BV1dg41167Y9" },
{ date: "2022-08-23 00:46", uid: "未明子", badge: ["发起人", "参与者", "星星家园"], msg: "【项目追踪】晚托班改造计划硬装部分阶段性介绍", video: "https://www.bilibili.com/video/BV1eB4y1z7Qc" },
{ date: "2022-08-31", uid: "张东冬", badge: ["参与者", "星星家园"], msg: "在八月 27 - 28 日共参与施工 2 天" },
{ date: "2022-08-31", uid: "盛航航", badge: ["参与者", "星星家园"], msg: "在八月 26 - 31 日共参与施工 6 天" },
{ date: "2022-08-31", uid: "刘源", badge: ["参与者", "星星家园"], msg: "在八月 24 日共参与施工 1 天" },
{ date: "2022-08-31", uid: "许沛洋", badge: ["参与者", "星星家园"], msg: "在八月 23 日共参与施工 1 天" },
{ date: "2022-08-31", uid: "张恒光", badge: ["参与者", "星星家园"], msg: "在八月 23 - 30 日共参与施工 8 天" },
{ date: "2022-08-31", uid: "李思源", badge: ["参与者", "星星家园"], msg: "在八月 23 - 24 日共参与施工 2 天" },
{ date: "2022-08-31", uid: "朱宏基", badge: ["参与者", "星星家园"], msg: "在八月 23 - 25 日共参与施工 3 天" },
{ date: "2022-08-31", uid: "郑昊", badge: ["参与者", "星星家园"], msg: "在八月 23 - 24 日共参与施工 2 天" },
{ date: "2022-08-31", uid: "应一楷", badge: ["参与者", "星星家园"], msg: "在八月 22 - 24 日共参与施工 3 天" },
{ date: "2022-08-31", uid: "田浩楠", badge: ["参与者", "星星家园"], msg: "在八月 22 - 26, 28 日共参与施工 6 天" },
{ date: "2022-08-31", uid: "孙陆钧", badge: ["参与者", "星星家园"], msg: "在八月 22 - 23 日共参与施工 2 天" },
{ date: "2022-08-31", uid: "张洲", badge: ["参与者", "星星家园"], msg: "在八月 22 - 25 日共参与施工 4 天" },
{ date: "2022-08-31", uid: "刘叙辰", badge: ["参与者", "星星家园"], msg: "在八月 22 - 24 日共参与施工 3 天" },
{ date: "2022-08-31", uid: "庞哲昊", badge: ["参与者", "星星家园"], msg: "在八月 21, 27 - 30 日共参与施工 5 天" },
{ date: "2022-08-31", uid: "燕少昕", badge: ["参与者", "星星家园"], msg: "在八月 21 - 23, 28 - 29, 30 日共参与施工 6 天" },
{ date: "2022-08-31", uid: "胡明达", badge: ["参与者", "星星家园"], msg: "在八月 21 日共参与施工 1 天" },
{ date: "2022-08-31", uid: "张成昊", badge: ["参与者", "星星家园"], msg: "在八月 21 - 30 日共参与施工 10 天" },
{ date: "2022-08-31", uid: "陆毅", badge: ["参与者", "星星家园"], msg: "在八月 21 - 33 日共参与施工 3 天" },
{ date: "2022-08-31", uid: "辛子豪", badge: ["参与者", "星星家园"], msg: "在八月 21 - 22 日共参与施工 2 天" },
{ date: "2022-08-31", uid: "马琳娜", badge: ["参与者", "星星家园"], msg: "在八月 21, 27 日共参与施工 2 天" },
{ date: "2022-08-31", uid: "梁卫天", badge: ["参与者", "星星家园"], msg: "在八月 21 - 28 日共参与施工 8 天" },
{ date: "2022-08-31", uid: "沙名轩", badge: ["参与者", "星星家园"], msg: "在八月 21, 23 - 25 日共参与施工 4 天" },
{ date: "2022-08-31", uid: "纪培煜", badge: ["参与者", "星星家园"], msg: "在八月 21, 27 日共参与施工 2 天" },
{ date: "2022-08-31", uid: "斯通", badge: ["参与者", "星星家园"], msg: "在八月 21 日共参与施工 1 天" },
{ date: "2022-08-31", uid: "陆一帜", badge: ["参与者", "星星家园"], msg: "在八月 21 日共参与施工 1 天" },
{ date: "2022-08-31", uid: "张济达", badge: ["参与者", "星星家园"], msg: "在八月 21, 28 日共参与施工 2 天" },
{ date: "2022-08-31", uid: "曹子函", badge: ["参与者", "星星家园"], msg: "在八月 21 - 22 日共参与施工 2 天" },
{ date: "2022-08-31", uid: "张明明", badge: ["参与者", "星星家园"], msg: "在八月 21, 23, 25 日共参与施工 3 天" },
{ date: "2022-08-31", uid: "张超培", badge: ["参与者", "星星家园"], msg: "在八月 21 - 30 日共参与施工 10 天" },
{ date: "2022-08-31", uid: "谢宇", badge: ["参与者", "星星家园"], msg: "在八月 22, 24 - 25, 27 - 28 日共参与施工 5 天" },
{ date: "2022-08-31", uid: "蔡思忘", badge: ["参与者", "星星家园"], msg: "在八月 22 - 24, 26 - 27, 29 日共参与施工 6 天" },
{ date: "2022-08-31", uid: "**匿名用户**", badge: ["参与者", "星星家园"], msg: "在八月 27 日共参与施工 1 天" },
{ date: "2022-08-31", uid: "赵贺", badge: ["参与者", "星星家园"], msg: "在八月 27 - 28 日共参与施工 2 天" },
],
sponsor: [
{ date: "2022-08-04", uid: "以太假说星星家园徽章的买家", badge: ["支持者", "星星家园"], msg: "提供支持:+9130.46\n属 1000 枚徽章销售的部分收入。\n网站开放用户注册功能后将邀请徽章买家注册用户名并在此显示支持者用户名。" }
]
}, {
aid: 1,
title: "星星家园伙食改善",
tag: ["进行中", "物资配给", "苏州", "星星家园"],
date: { pub: "2022-09-05 07:28", update: "2022-09-05 07:28" },
stat: {
fund: 7270, budget: 7270, expense: 0,
detail: "https://docs.qq.com/sheet/DZWVJeVd6V1ZlYklk",
progress: [
{ goal: "2022九月伙食改善", pct: 0 },
{ goal: "2022十月伙食改善", pct: 0 },
{ goal: "2022十一月伙食改善", pct: 0 },
{ goal: "2022十二月伙食改善", pct: 0 },
]
},
participant: [
{ date: "2022-07-04 12:34", uid: "未明子", badge: ["发起人", "星星家园"], msg: "作为发起人参与活动" },
{ date: "2022-07-04 12:34", uid: "张正午", badge: ["发起人", "星星家园"], msg: "作为发起人参与活动" },
],
activity: [
{ date: "2022-08-04 14:35", uid: "张正午", badge: ["发起人", "星星家园"], msg: "工人子弟晚托班苏州星星家园环境改造/伙食改善公益项目工作记录", video: "https://www.bilibili.com/video/BV1zT411L7JP" },
{ date: "2022-08-04 22:17", uid: "未明子", badge: ["发起人", "星星家园"], msg: "【现实行动】我们目前的一个行动项目", video: "https://www.bilibili.com/video/BV1xG4y1v7MV" },
],
sponsor: [
{ date: "2022-08-04", uid: "以太假说星星家园徽章的买家", badge: ["支持者", "星星家园"], msg: "提供支持:+7269.54\n属 1000 枚徽章销售的部分收入。\n网站开放用户注册功能后将邀请徽章买家注册用户名并在此显示支持者用户名。" }
]
}, {
aid: 0,
title: "主义主义网站开发",
tag: ["进行中", "软件开发", "杭州", "成都", "主义主义网站"],
date: { pub: "2022-09-05 07:28", update: "2022-09-05 07:28" },
stat: {
fund: 519, budget: 519, expense: 519,
detail: "https://docs.qq.com/sheet/DZUl1Q1N5aGNGYk9x",
progress: [
{ goal: "主义主义卡片重铸网站", pct: 0 },
{ goal: "主义主义活动公示网站", pct: 15 },
{ goal: "魔怔人论坛", pct: 100 },
]
},
participant: [
{ date: "2021-04-03", uid: "zzy", badge: ["参与者", "主义主义网站"], msg: "作为程序员参与活动" },
{ date: "2021-04-03", uid: "laofan", badge: ["参与者", "主义主义网站"], msg: "作为程序员参与活动" },
{ date: "2021-04-03", uid: "川羽", badge: ["参与者", "主义主义网站"], msg: "作为程序员参与活动" },
{ date: "2022-07-04", uid: "未明子", badge: ["发起人", "支持者", "主义主义网站"], msg: "作为发起人参与活动" },
{ date: "2022-07-04", uid: "张正午", badge: ["发起人", "支持者", "主义主义网站"], msg: "作为发起人参与活动" },
{ date: "2022-07-24", uid: "万大可", badge: ["参与者", "支持者", "主义主义网站"], msg: "作为程序员参与活动" },
],
activity: [
{ date: "2021-04-03", uid: "川羽", badge: ["参与者", "主义主义网站"], msg: "魔怔人论坛上线" },
{ date: "2021-05-28", uid: "川羽", badge: ["参与者", "主义主义网站"], msg: "魔怔人论坛内测结束\n目标进度 100%:魔怔人论坛" },
{ date: "2022-07-04 01:38", uid: "未明子", badge: ["发起人", "支持者", "主义主义网站"], msg: "【实践】我的行动路径——我卖什么货,我开什么店,我成立什么团体,我追求什么理想", video: "https://www.bilibili.com/video/BV1if4y1Z7xo" },
{ date: "2022-08-01 01:46", uid: "未明子", badge: ["发起人", "支持者", "主义主义网站"], msg: "【公告】我们眼下的行动路径", video: "https://www.bilibili.com/video/BV1wa411M7jK" },
{ date: "2022-08-14 01:45", uid: "未明子", badge: ["发起人", "支持者", "主义主义网站"], msg: "【行动计划】我们打算做一个什么样的网站1——初步功能", video: "https://www.bilibili.com/video/BV1EG411t7Wh" },
{ date: "2022-09-05", uid: "万大可", badge: ["参与者", "支持者", "主义主义网站"], msg: "上线网站 ismist.cn\n目标进度 15%:主义主义活动公示网站" },
],
sponsor: [
{ date: "2021-04-03", uid: "张正午", badge: ["发起人", "支持者", "主义主义网站"], msg: "提供支持:+379\n服务器费用2月份" },
{ date: "2021-05-12", uid: "YOOSON", badge: ["支持者", "主义主义网站"], msg: "提供支持:+35\nismism.club 域名费用1年份" },
{ date: "2022-08-08", uid: "未明子", badge: ["发起人", "支持者", "主义主义网站"], msg: "提供支持:+35\nismism.cn 域名费用1年份" },
{ date: "2022-08-11", uid: "万大可", badge: ["参与者", "支持者", "主义主义网站"], msg: "提供支持:+70\nismist.cn 与 主义主义.中国 域名费用1年份" },
]
}
]
const recent = [
]
function etitle(
el, { aid, title, tag, date }
) {
const a = el.getElementsByTagName("a")[0]
a.href = `#${aid}`
a.getElementsByTagName("code")[0].innerText = `#${aid}`
a.getElementsByTagName("span")[0].innerText = title
a.classList.add("title")
etag(el.getElementsByClassName("tag")[0], tag)
const d = el.getElementsByClassName("date")[0].getElementsByTagName("span")
d[0].innerText = date.pub
d[1].innerText = date.update
}
function eimg(
el, d
) {
if (d.img == undefined || d.img.length == 0) {
el.style.display = "none"
return
}
const s = el.getElementsByTagName("div")[0].children
const img = el.getElementsByTagName("img")[0]
const nimg = dn => {
d.nimg = ((d.nimg + dn) % d.img.length + d.img.length) % d.img.length
s[0].innerText = d.img[d.nimg].title
s[2].children[0].innerText = d.nimg + 1
s[2].children[1].innerText = d.img.length
img.src = d.img[d.nimg].src
}
nimg(0)
s[1].children[0].addEventListener("click", () => nimg(-1))
s[1].children[1].addEventListener("click", () => nimg(+1))
}
function estat(
el, stat
) {
el.style.setProperty("--fund", stat.fund)
el.style.setProperty("--budget", stat.budget)
el.style.setProperty("--expense", stat.expense)
const fund = el.getElementsByClassName("fund")[0].children
fund[0].innerText = stat.fund
fund[1].innerText = `${(stat.fund / stat.budget * 100).toFixed(0)}%`
fund[2].innerText = stat.budget
const expense = el.getElementsByClassName("expense")[0].children
expense[0].innerText = stat.expense
expense[1].innerText = `${(stat.expense / stat.budget * 100).toFixed(0)}%`
el.getElementsByTagName("a")[0].href = stat.detail
const tg = document.getElementById("circle-item").content.children
const circle = el.getElementsByClassName("circle")[0]
for (const { goal, pct } of stat.progress) {
const c = circle.appendChild(tg[(pct == 0 || pct >= 100) ? 1 : 0].cloneNode(true))
c.children[0].style.setProperty("--pct", pct)
c.children[0].innerText = pct >= 100 ? "完成" : `${pct}%`
c.children[1].innerText = goal
}
}
const cbadge = new Map([
["发起人", "red"],
["参与者", "amber"],
["支持者", "purple"],
["星星家园", "black"],
["主义主义网站", "black"],
]);
function ebadge(
el, badge
) {
const t = document.getElementById("badge-item").content.children[0]
for (const b of badge) {
const s = el.appendChild(t.cloneNode(true))
const c = cbadge.get(b)
if (c) s.classList.add(c)
s.innerText = b
}
}
function elog(
el, unit, msg
) {
el.innerHTML = ""
const tl = document.getElementById("log-item").content.children
const tv = document.getElementById("video-link").content.children[0]
const head = el.appendChild(tl[0].cloneNode(true))
head.innerText = `${msg.length} ${unit}`
for (const m of msg) {
const d = el.appendChild(tl[1].cloneNode(true)).children
d[0].innerText = m.uid[0]
d[1].children[0].innerText = m.uid
ebadge(d[1].children[0], m.badge)
d[1].children[1].innerText = m.date
if (m.video) {
d[1].children[2].innerText = "发布了视频:"
const v = d[1].children[2].appendChild(tv.cloneNode(true))
v.innerText = m.msg
v.href = m.video
}
else d[1].children[2].innerText = m.msg
}
const foot = el.appendChild(tl[0].cloneNode(true))
foot.innerText = head.innerText
}
function emsg(
el, { participant, activity, sponsor }
) {
const tab = el.getElementsByClassName("tab")[0].children
tab[0].children[0].innerText = activity.length
tab[1].children[0].innerText = participant.length
tab[2].children[0].innerText = sponsor.length
const log = [...el.getElementsByClassName("log")]
elog(log[0], "条活动日志", activity)
elog(log[1], "名参与者", participant)
elog(log[2], "位支持者", sponsor)
log.forEach(l => l.style.display = "none")
const toggle = (b, n) => {
if (b.classList.contains("dark-gray")) {
b.classList.remove("dark-gray")
log[n].style.display = "none"
} else {
for (const t of tab) t.classList.remove("dark-gray")
log.forEach(l => l.style.display = "none")
b.classList.add("dark-gray")
log[n].style.display = "block"
log[n].scrollTop = log[n].scrollHeight
}
}
tab[0].addEventListener("click", () => toggle(tab[0], 0))
tab[1].addEventListener("click", () => toggle(tab[1], 1))
tab[2].addEventListener("click", () => toggle(tab[2], 2))
}
function earticle(
el
) {
el.innerHTML = ""
const aid = parseInt(hash)
const ds = isNaN(aid)
? (hash.length > 0 ? articles.filter(a => a.tag.includes(hash)) : articles)
: [articles.find(p => p.aid == aid)]
const ta = document.getElementById("article").content.children[0]
for (const d of ds) {
const a = el.appendChild(ta.cloneNode(true))
etitle(a.getElementsByClassName("title")[0], d)
eimg(a.getElementsByClassName("photo")[0], d)
estat(a.getElementsByClassName("stat")[0], d.stat)
emsg(a.getElementsByClassName("msg")[0], d)
}
}
function erecent(
el
) {
el.innerHTML = ""
elog(el, "条最新动态", recent)
}
window.addEventListener("hashchange", () => {
hash = decodeURI(window.location.hash).substr(1)
etag(
document.getElementsByTagName("header")[0].getElementsByClassName("tag")[0],
tags, true
)
earticle(document.getElementsByClassName("main")[0])
erecent(document.getElementsByClassName("recent")[0])
})
function load(
) {
window.dispatchEvent(new Event("hashchange"))
}
load()
</script>
</html>