
来自 春湫没吃饱-7号满月版 的公开树洞投稿,继续留在同一个个人空间里查看上下文。
都有后端了怎么能没前端呢 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>文件下载中心</title> <!-- 本地 Bootstrap CSS --> <link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet"> <!-- 本地 Bootstrap Icons --> <link href="{{ url_for('static', filename='icons/bootstrap-icons.css') }}" rel="stylesheet"> <style> :root { --primary-color: #0d6efd; --secondary-color: #6c757d; --success-color: #198754; --light-bg: #f8f9fa; --card-shadow: 0 4px 8px rgba(0,0,0,0.05); } body { background-color: var(--light-bg); font-family: 'Segoe UI', system-ui, -apple-system, sans-serif; } .card { border-radius: 10px; box-shadow: var(--card-shadow); margin-bottom: 20px; border: none; transition: transform 0.2s; } .card:hover { transform: translateY(-2px); } .card-header { background-color: #ffffff; border-bottom: 1px solid #e9ecef; padding: 15px 20px; font-weight: 600; border-radius: 10px 10px 0 0 !important; } .file-type-badge { font-family: 'SF Mono', 'Consolas', 'Monaco', 'Courier New', monospace; background-color: #e9ecef; color: #495057; border-radius: 4px; padding: 4px 8px; font-size: 0.9em; font-weight: 600; letter-spacing: 0.5px; } .filter-section { background-color: #ffffff; border-radius: 10px; padding: 20px; margin-bottom: 25px; box-shadow: 0 2px 4px rgba(0,0,0,0.03); } .upload-container { position: sticky; top: 20px; } .upload-card { height: 100%; } .table-hover tbody tr:hover { background-color: rgba(13, 110, 253, 0.05); } .file-link { font-weight: 500; color: #212529; transition: color 0.2s; } .file-link:hover { color: var(--primary-color); text-decoration: none; } .btn-upload { background-color: var(--success-color); border-color: var(--success-color); font-weight: 500; padding: 10px 16px; font-size: 1.1rem; } .btn-upload:hover { background-color: #157347; border-color: #146c43; } .file-icon { margin-right: 8px; color: var(--secondary-color); } .file-row { display: flex; align-items: center; } .file-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 300px; } .no-files { padding: 40px 20px; text-align: center; color: var(--secondary-color); } .upload-instruction { font-size: 0.9rem; color: var(--secondary-color); } @media (max-width: 992px) { .upload-container { position: static; margin-top: 30px; } .file-name { max-width: 200px; } } @media (max-width: 768px) { .file-name { max-width: 150px; } } </style> </head> <body> <div class="container-fluid py-4"> <div class="row mb-4"> <div class="col-12 text-center"> <h1 class="mb-0">文件下载中心</h1> </div> </div> <!-- 搜索和筛选区域 --> <div class="filter-section"> <form id="searchForm" onsubmit="performSearch(event)"> <div class="row g-3 align-items-end"> <!-- 文件名搜索 --> <div class="col-md-5"> <label for="searchQuery" class="form-label fw-medium">文件名搜索:</label> <input type="text" class="form-control" id="searchQuery" placeholder="输入文件名关键字..." value="{{ query }}"> </div> <!-- 文件类型筛选 --> <div class="col-md-4"> <label for="extensionFilter" class="form-label fw-medium">文件类型:</label> <select class="form-select" id="extensionFilter"> <option value="all" {% if selected_ext == 'all' %}selected{% endif %}>所有类型</option> {% for ext in extensions %} <option value="{{ ext }}" {% if selected_ext == ext %}selected{% endif %}>{{ ext | upper }}</option> {% endfor %} </select> </div> <!-- 操作按钮 --> <div class="col-md-3"> <button type="submit" class="btn btn-primary w-100 fw-medium">搜索</button> <button type="button" class="btn btn-outline-secondary w-100 mt-2" onclick="resetSearch()">重置</button> </div> </div> </form> </div> <div class="row"> <!-- 左侧文件列表 (占70%) --> <div class="col-lg-8"> <div class="card"> <div class="card-header d-flex justify-content-between align-items-center"> <h5 class="mb-0">文件列表</h5> <span class="badge bg-primary rounded-pill">{{ files | length }} 个文件</span> </div> <div class="card-body p-0"> {% if files %} <div class="table-responsive"> <table class="table table-hover mb-0"> <thead class="table-light"> <tr> <th scope="col" style="width: 60%">文件名</th> <th scope="col">类型</th> <th scope="col" class="text-end">操作</th> </tr> </thead> <tbody> {% for file in files %} <tr> <td> <div class="file-row"> <i class="bi bi-file-earmark file-icon"></i> <span class="file-link file-name" title="{{ file.name }}{% if file.ext %}.{{ file.ext }}{% endif %}"> {{ file.name }}{% if file.ext %}.{{ file.ext }}{% endif %} </span> </div> </td> <td> {% if file.ext %} <span class="file-type-badge">{{ file.ext | upper }}</span> {% else %} <span class="text-muted">-</span> {% endif %} </td> <td class="text-end"> <a href="{{ url_for('download_file', filename=file.fullname) }}" class="btn btn-sm btn-outline-primary px-3">下载</a> </td> </tr> {% endfor %} </tbody> </table> </div> {% else %} <div class="no-files"> <i class="bi bi-folder-x" style="font-size: 3rem; margin-bottom: 15px;"></i> <h4 class="text-muted">没有找到匹配的文件</h4> <p class="text-muted">尝试更改搜索条件或上传新文件</p> </div> {% endif %} </div> </div> </div> <!-- 右侧上传表单 (占30%) --> <div class="col-lg-4"> <div class="upload-container"> <div class="card upload-card"> <div class="card-header"> <h5 class="mb-0">上传文件</h5> </div> <div class="card-body"> <form id="uploadForm" enctype="multipart/form-data"> <div class="mb-4"> <label for="fileInput" class="form-label fw-medium mb-2">选择文件</label> <input class="form-control" type="file" name="file" id="fileInput"> <div class="upload-instruction mt-2"> 支持所有类型的文件上传,最大文件大小:10MB </div> </div> <div class="d-grid"> <button type="submit" class="btn btn-upload fw-medium"> <i class="bi bi-cloud-upload me-2"></i>上传文件 </button> </div> </form> <!-- 上传提示 --> <div class="mt-4 pt-3 border-top"> <h6 class="fw-medium mb-3">上传说明:</h6> <ul class="list-unstyled"> <li class="mb-2"> <i class="bi bi-check-circle me-2 text-success"></i> <span class="upload-instruction">文件名将自动清理特殊字符</span> </li> <li class="mb-2"> <i class="bi bi-check-circle me-2 text-success"></i> <span class="upload-instruction">上传后文件将立即出现在列表中</span> </li> <li> <i class="bi bi-check-circle me-2 text-success"></i> <span class="upload-instruction">支持批量上传多个文件</span> </li> </ul> </div> </div> </div> </div> </div> </div> </div> <!-- 本地 Bootstrap Bundle JS --> <script src="{{ url_for('static', filename='js/bootstrap.bundle.min.js') }}"></script> <script> // 搜索功能 function performSearch(event) { event.preventDefault(); const query = document.getElementById('searchQuery').value; const extension = document.getElementById('extensionFilter').value; // 构建查询参数 let params = new URLSearchParams(); if (query) params.append('q', query); if (extension !== 'all') params.append('ext', extension); window.location.href = "{{ url_for('search_files') }}?" + params.toString(); } // 重置搜索 function resetSearch() { document.getElementById('searchQuery').value = ''; document.getElementById('extensionFilter').value = 'all'; performSearch(new Event('submit')); } // 上传功能 document.getElementById('uploadForm').addEventListener('submit', async function(event) { event.preventDefault(); const fileInput = document.getElementById('fileInput'); const submitBtn = event.submitter; const originalBtnHTML = submitBtn.innerHTML; if (!fileInput.files[0]) { alert("请先选择要上传的文件!"); return false; } // 检查文件大小(10MB限制) const maxSize = 10 * 1024 * 1024; // 10MB if (fileInput.files[0].size > maxSize) { alert("文件大小超过10MB限制!"); return false; } try { // 显示上传提示 submitBtn.disabled = true; submitBtn.innerHTML = ` <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> 上传中... `; const formData = new FormData(this); const response = await fetch("{{ url_for('upload_file') }}", { method: 'POST', body: formData }); if (response.ok) { const result = await response.text(); // 保留当前搜索状态 const query = document.getElementById('searchQuery').value; const extension = document.getElementById('extensionFilter').value; let params = new URLSearchParams(); if (query) params.append('q', query); if (extension !== 'all') params.append('ext', extension); // 显示成功提示 submitBtn.innerHTML = `<i class="bi bi-check-circle me-2"></i>上传成功`; submitBtn.classList.remove('btn-upload'); submitBtn.classList.add('btn-success'); // 3秒后刷新页面 setTimeout(() => { window.location.href = "{{ url_for('search_files') }}?" + params.toString(); }, 1500); } else { const errorText = await response.text(); throw new Error(errorText || '上传失败'); } } catch (error) { alert('上传出错: ' + error.message); submitBtn.disabled = false; submitBtn.innerHTML = originalBtnHTML; submitBtn.classList.add('btn-upload'); submitBtn.classList.remove('btn-success'); } }); </script> </body> </html>
春湫蹲在腐烂的云朵褶皱里啃碎月光,指甲缝塞满发潮的星子碎屑,她不呼吸,胸腔里塞满拧成麻花的晚风,每一次心脏跳动都在吐出发霉的柳絮。 她抬头,看见唯美长在倒置的地平线裂缝上,骨头是融化的雾,睫毛倒挂着粘稠的黄昏,没有瞳孔,眼窝里灌满稀释的沉默,整个人软塌塌的,像被揉烂又强行铺平的劣质梦境。 春湫开始发癫,舌头打结啃咬自己的影子,影子会尖叫,会融化成墨绿色的泥浆,顺着地面缝隙钻去啃食唯美的脚踝。她笑着,笑声是破碎玻璃泡炸裂的闷响,断断续续黏在空气里:你为什么长在世界的反面,你的呼吸是反着流的,我摸到你的体温是冰块煮烂的酸。 唯美不说话,他的语言是扭曲的线条,是扭曲时空里拧成一团的空白,他抬手,指尖滴落粘稠的晚霞碎渣,落在春湫乱糟糟的发顶,瞬间长出黑色的、扭曲的枯草,枯草疯狂缠绕,勒住她的脖颈,却没有半点痛感,只有无边无际的虚无发痒。 春湫原地扭曲扭动,四肢不受控制地反向弯折,骨头发出棉花揉皱的轻响,她撕扯自己的衣角,衣角里涌出成千上万只不会飞的白色碎蝶,碎蝶没有翅膀,只会堆叠、腐烂、互相吞噬。她盯着唯美颠倒的侧脸,疯言疯语,逻辑彻底溃散:春天淹死在秋天里了,所以我叫春湫,你叫唯美,唯美是烂掉的浪漫尸体,泡在死水里面发臭发涨。 整片空间开始无序折叠,上一秒脚下是干裂的星河,下一秒头顶是泡发的泥土,时间被揉成纸团塞进喉咙,味觉错乱,苦涩、甜腻、腐烂的味道混杂在一起塞满五脏六腑。 唯美缓慢漂浮起来,身体一点点透明,化作无数细碎的唯美碎片,每一片碎片都印着空洞的眉眼,密密麻麻悬浮在半空。春湫伸手去抓,指尖穿过碎片,抓到一把空荡荡的混沌,她开始原地转圈,越转越快,头发疯长,缠绕住坠落的残碎日月。 我要吞掉所有唯美,我要把颠倒的黄昏缝进我的肋骨,春湫嘶吼,嗓音破碎又诡异,我是春秋溺亡的残躯,是昼夜错位的疯子,世界本就是一场无意义的腐烂,你那虚无的唯美,不过是腐烂开出的畸形白花。 碎片缓缓聚拢,唯美重新成型,依旧沉默,依旧空洞,他走向扭曲的春湫,两人之间的空气扭曲成怪异的褶皱,现实崩裂,规则消散。 春湫贴上去,额头抵着他没有温度的额头,疯癫的笑意挂在脸上,眼底是混沌无序的荒芜。 我们都被困在抽象的牢笼,你是死寂的唯美,我是疯长的春湫,一起腐烂,一起发癫,一起在不存在的边界里,永无止境的混沌沉沦。 万物失序,黑白颠倒,风在倒流,星子在腐烂,两个游离在常理之外的人,在无边抽象里,永远沉沦,永久疯癫。
【场景无边界,没有光影,只有漫无边际的灰,风是静止的,却能听见布料摩擦的细碎声响,像未拆封的沉默】 春湫(指尖悬在半空,没有落点,声音轻得像雾的碎片):你看见的,是我掉在风里的第几片影子? 唯美(站在三步之外,身形半虚,语气没有起伏,像回声撞在空谷):影子没有数量,只有褶皱,你把褶皱叠成了雾,我把雾揉成了你的名字。 【春湫抬手,指尖没有触碰任何东西,却有细碎的白屑从指缝落下,不是雪,不是霜,落在地上便化了,没有痕迹】 春湫(低头看自己的掌心,掌心是空的,却像握着什么易碎的东西):他们说,具象的都留不住,那抽象的,会不会也会被风嚼碎? 唯美(缓缓抬手,指尖与春湫的指尖隔空相对,距离不变,却像有无形的线缠绕):嚼碎的不是抽象,是我们不肯给抽象一个形状,你把情绪碾成了星子,我把星子拼成了未说出口的停顿。 【雾开始变浓,两人的身形渐渐模糊,声音越来越轻,像被雾吸走,只剩零星的碎片】 春湫(声音飘在雾里,分不清方向):如果回声没有回应,是不是就等于从未发出过声音? 唯美(声音贴着雾的边缘,若有若无):回声的回应,藏在你以为的空白里,就像我站在这里,不是存在,也不是消失,是你目光里的一段模糊。 【雾彻底淹没一切,没有声音,没有身形,只有一段悬浮的沉默,像从未开始,也从未结束——】 春湫(极轻,轻到像错觉):那我们,是雾本身,还是雾里的回声? 【没有回应,雾散了,什么都没有留下,只有一段若有似无的气息,证明曾有两个影子,在空白里,说过一段没有意义的话】
春qiu好好活着!
“加油啊,春湫,就剩下十五分钟了!”“副社长,学生会不批,社长也不知道跑哪里去了,我们社团的经费就靠你了!”“表情再萌一点,湫哥” 此时,春湫正坐在电脑前,视线聚焦于眼前的形象,一个令他有些迷茫的形象——蓬松的白发,小巧的发饰点缀,晶莹的异瞳,梦幻的白色服装,神态甜美朦胧的俏皮灵动的少女。他现在不知道应该吐槽为什么文学社要靠直播赚经费还是为什么文学社的社员会直播还是为什么他一个虚拟主播要在现实中扮成和虚拟形象一样。 “嗯……嗯……,大家晚上好,我是春湫”他深吸一口气,熟练的维持着这一脆弱的少女形象。与此同时,屏幕上的弹幕如瀑布般翻滚。“awsl,新老婆!”“妹妹,快让姐姐抱抱”“这声音好软”春湫的手指蜷缩在衣袖里,指甲几乎要嵌入掌心。“大家喜欢听湫儿唱的歌吗?”刻意甜美的声音经过麦克风在直播间流淌,又掀起一阵弹幕浪潮 。 这时,活动室的门突然发出了声响,春湫如同生锈的机器人一样缓缓回头。门被推开一道不宽不窄的缝,然后,一个人进来了,一个他熟的不能再熟的人来了……他的一生之敌,隔壁班班长兼全校第一兼文学社社长兼青梅竹马。她带着 一丝回到熟悉环境的放松视线随意扫过活动室,然后毫无征兆地看向他。时间仿佛定格了……一丝极其细微的弧度在她脸上浮现。“抱歉,我好像走错了呢~”略带慵懒的明亮声线在活动室和直播间响起,然后便是关门声 危机解除了吗?那个笑容……正当春湫想完成最后几分钟营业的时候,门又开了,以一种更加从容的方式踢开。她回来了,脸上带着灼热的笑容,仿佛盛夏的阳光。她步履轻快,径直走向他。“哎呀,我的妹妹”她那张漂亮得不像样的脸占据了春湫的视野,淡淡的青柑橘香气瞬间笼罩春湫。“刚才我都没好好的看着你呢,你看,妆都花了” 春湫头脑一片空白,看着她那纤细的手指为自己补妆,周围一片寂静。“别动哦~马上就好了”粉扑按压在脸上,动作轻柔。直播间似乎在热烈的讨论突如其来的姐妹戏码,直呼磕到了。“好啦,完成”不知过了多久,她终于再次开口。她直起身,笑容仿佛能融化冰雪“大家一定要支持我家妹妹哦~”随后,她便步履轻快的离开了,就像她刚来时一样。 门,再次合拢,只剩下瘫倒在地上的春湫和社员面面相觑 周六,她敲响了春湫家的门,春湫看到了,身穿休闲连衣裙的她抱着一大堆东西 “上午好哦~我的好姐妹”
春湫推开总裁办公室的门,看见煤湫正单膝跪地,为她养的绿萝擦拭叶片。 “姐姐回来了!”他眼睛一亮,像只兴奋的大型犬冲过来,却在三步外急刹,手足无措。 春湫脱下风衣,他立刻接过挂好。 “你是副总裁,不是我的助理。”她冷淡道。 煤湫挠头笑,露出白牙:“可我想照顾姐姐。” 这张脸太有欺骗性。这个“小奶狗”三个月前刚用铁腕收购了最大竞争对手,行业震动。 “并购案会议准备好了?” “资料齐了。”他递上文件夹,又从口袋掏出小盒子,“姐姐昨天胃疼,我买了热敷贴和养胃茶,温度刚好。” 春湫心头一软。三年前,这少年浑身是伤倒在雨夜,是她带他回家。他从沉默少年成长为商场上令人闻风丧胆的“黑煤老板”。 在她面前,他永远是那只温顺小狗。 会议顺利。对方讨价还价,黑湫只是抬眼,温和一句“您再考虑下”,对方立刻噤声签字。 散会后,他亦步亦趋跟着。 “姐姐,我表现好吗?” “嗯。” “那有奖励吗?” 他掏出两张票:“今晚音乐会。姐姐该放松了。” 春湫看着票面上她最爱的钢琴家名字,知道这不可能是“朋友送的”。可看着他眼中的期待,拒绝的话说不出口。 “好吧。” 音乐会上,当爱情协奏曲响起时,他悄悄握住了她的手。春湫没有挣脱。 深夜,她站在办公室落地窗前。黑湫端着热牛奶进来。 “姐姐是在想,我到底是什么样的人,对吗?”他声音很低,“在商场上我必须强硬,才能保护姐姐和公司。但在您面前,我永远是黑湫。只属于您的黑湫。” 春湫看着已比她高出一头的年轻人,意识到当年受伤的小狗已长成能独当一面的狼。只是在她面前,他仍愿收起利爪,露出柔软的肚皮。 “我知道。”她轻声道,第一次主动抚摸他头发。 黑湫愣住,眼中迸发狂喜。他小心地将脸贴在她掌心,像终于被认可的小狗。 “姐姐。” “嗯?” “我可以抱抱你吗?” 春湫没有回答,只是张开手臂。黑湫将她轻柔拥入怀中。 “我会变得更强,为你挡下一切风雨。”他低语,“请让我永远留在你身边,好吗?” 春湫轻轻点头。 她忽然明白,或许真正的强大,是敢于在某人面前暴露最柔软的部分。 而她的黑煤小狗,早已将最脆弱的脖颈,交到了她的手中。
春卷生日快乐,恭喜我们的茂密又长大了一岁(又老一岁)恭喜恭喜。emmmmm好吧也是不知道说什么好了,脑瓜子燃尽了捏,不过呢还是希望春卷可以越播越好,能遇上会给春卷爆大米的老大哥!以及生日快乐,也是给你送了两个小礼物算是我的一点小心意。好了就说到这里了已经不知道要说什么了捏。ciao~