From 524c0bff85e25a8c62ace446907a7c4eca389e49 Mon Sep 17 00:00:00 2001 From: ember <1279347317@qq.com> Date: Sat, 22 Nov 2025 22:37:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=85=B3=E4=BA=8E=E9=A1=B5?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/css/299.af5d7086.css | 1 - dist/css/851.2abe3c1e.css | 1 + dist/index.html | 2 +- dist/js/299.e4540d96.js | 2 -- dist/js/851.d90b5d58.js | 2 ++ dist/js/{app.c4f97ed8.js => app.0b97a982.js} | 4 ++-- src/views/AboutView.vue | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 dist/css/299.af5d7086.css create mode 100644 dist/css/851.2abe3c1e.css delete mode 100644 dist/js/299.e4540d96.js create mode 100644 dist/js/851.d90b5d58.js rename dist/js/{app.c4f97ed8.js => app.0b97a982.js} (96%) diff --git a/dist/css/299.af5d7086.css b/dist/css/299.af5d7086.css deleted file mode 100644 index c5dba1d..0000000 --- a/dist/css/299.af5d7086.css +++ /dev/null @@ -1 +0,0 @@ -.about-view[data-v-94423fa8]{background-color:#f5f5f7;min-height:100vh;padding-top:60px}.container[data-v-94423fa8]{max-width:1000px;margin:0 auto;padding:2rem 1rem}.page-title[data-v-94423fa8]{font-size:2rem;font-weight:700;margin-bottom:2rem;color:#333;text-align:center}.intro-card[data-v-94423fa8]{background-color:#fff;border-radius:10px;padding:2rem;margin-bottom:3rem;box-shadow:0 4px 15px rgba(0,0,0,.08);border-left:4px solid #3273dc;position:relative;overflow:hidden}.intro-card[data-v-94423fa8]:before{content:"";position:absolute;top:0;right:0;width:200px;height:200px;background:radial-gradient(circle at top right,rgba(50,115,220,.08),transparent 70%);z-index:0}.intro-wrapper[data-v-94423fa8]{display:flex;flex-direction:row;gap:2rem}@media(max-width:768px){.intro-wrapper[data-v-94423fa8]{flex-direction:column;gap:1.5rem}}.intro-title[data-v-94423fa8]{font-size:1.5rem;font-weight:600;margin-bottom:1.5rem;color:#333;position:relative;z-index:1}.intro-content[data-v-94423fa8]{position:relative;z-index:1;flex:1}.intro-content p[data-v-94423fa8]{margin-bottom:1rem;line-height:1.6;color:#555}.intro-content p[data-v-94423fa8]:last-child{margin-bottom:0}.contact-author[data-v-94423fa8]{display:flex;flex-direction:column;align-items:center;justify-content:center}.contact-author .qrcode-box[data-v-94423fa8]{width:120px;height:120px;border-radius:8px;padding:8px;background-color:#fff;box-shadow:0 2px 8px rgba(0,0,0,.1);margin-bottom:.8rem}.contact-author .qrcode-box .qrcode-img[data-v-94423fa8]{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.contact-author .contact-title[data-v-94423fa8]{font-weight:500;color:#444;text-align:center}.donation-section[data-v-94423fa8]{background-color:#fff;border-radius:10px;padding:2rem;margin-bottom:3rem;text-align:center;box-shadow:0 4px 15px rgba(0,0,0,.08)}.section-title[data-v-94423fa8]{font-size:1.5rem;font-weight:600;margin-bottom:1rem;color:#333}.donation-desc[data-v-94423fa8]{margin-bottom:2rem;max-width:600px;margin-left:auto;margin-right:auto;color:#555}.qrcode-container[data-v-94423fa8]{display:flex;justify-content:center;gap:3rem;flex-wrap:wrap}.qrcode-item[data-v-94423fa8]{display:flex;flex-direction:column;align-items:center}.qrcode-box[data-v-94423fa8]{width:150px;height:150px;border-radius:8px;padding:10px;background-color:#fff;box-shadow:0 2px 8px rgba(0,0,0,.1);margin-bottom:1rem}.qrcode-box .qrcode-img[data-v-94423fa8]{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.qrcode-title[data-v-94423fa8]{font-weight:500;color:#444}.timeline-section[data-v-94423fa8]{background-color:#fff;border-radius:10px;padding:2rem;box-shadow:0 4px 15px rgba(0,0,0,.08)}.timeline[data-v-94423fa8]{position:relative;padding-left:2rem}.timeline[data-v-94423fa8]:before{content:"";position:absolute;top:0;bottom:0;left:8px;width:2px;background-color:#e0e0e0}.timeline-month[data-v-94423fa8]{position:relative;margin-bottom:2.5rem}.timeline-month[data-v-94423fa8]:last-child{margin-bottom:0}.month-marker[data-v-94423fa8]{position:absolute;left:-2rem;top:0}.month-marker .month-date[data-v-94423fa8]{display:block;background-color:#3273dc;color:#fff;padding:.5rem 1rem;border-radius:20px;font-weight:600;font-size:.9rem;position:relative;z-index:2;margin-left:2rem}.month-marker[data-v-94423fa8]:before{content:"";position:absolute;width:18px;height:18px;border-radius:50%;background-color:#3273dc;left:0;top:10px;z-index:2}.month-events[data-v-94423fa8]{padding-top:3.5rem}.timeline-event[data-v-94423fa8]{position:relative;padding-left:1.5rem;margin-bottom:2rem}.timeline-event[data-v-94423fa8]:last-child{margin-bottom:0}.timeline-event[data-v-94423fa8]:before{content:"";position:absolute;width:12px;height:12px;border-radius:50%;background-color:#f0f0f0;border:2px solid #3273dc;left:-31px;top:4px;z-index:2}.event-date[data-v-94423fa8]{font-size:.9rem;color:#666;margin-bottom:.5rem;font-weight:500}.event-title[data-v-94423fa8]{font-size:1.1rem;font-weight:600;color:#333;margin-bottom:.5rem}.event-desc[data-v-94423fa8]{color:#555;line-height:1.5}@media(max-width:768px){.page-title[data-v-94423fa8]{font-size:1.6rem;text-align:left}.donation-section[data-v-94423fa8],.intro-card[data-v-94423fa8],.timeline-section[data-v-94423fa8]{padding:1.5rem}.qrcode-container[data-v-94423fa8]{gap:2rem}.timeline[data-v-94423fa8]{padding-left:1rem}.month-marker[data-v-94423fa8]{left:-1rem}.timeline-event[data-v-94423fa8]{padding-left:.5rem}.timeline-event[data-v-94423fa8]:before{left:-15px}} \ No newline at end of file diff --git a/dist/css/851.2abe3c1e.css b/dist/css/851.2abe3c1e.css new file mode 100644 index 0000000..3dbc416 --- /dev/null +++ b/dist/css/851.2abe3c1e.css @@ -0,0 +1 @@ +.about-view[data-v-253ce43f]{background-color:#f5f5f7;min-height:100vh;padding-top:60px}.container[data-v-253ce43f]{max-width:1000px;margin:0 auto;padding:2rem 1rem}.page-title[data-v-253ce43f]{font-size:2rem;font-weight:700;margin-bottom:2rem;color:#333;text-align:center}.intro-card[data-v-253ce43f]{background-color:#fff;border-radius:10px;padding:2rem;margin-bottom:3rem;box-shadow:0 4px 15px rgba(0,0,0,.08);border-left:4px solid #3273dc;position:relative;overflow:hidden}.intro-card[data-v-253ce43f]:before{content:"";position:absolute;top:0;right:0;width:200px;height:200px;background:radial-gradient(circle at top right,rgba(50,115,220,.08),transparent 70%);z-index:0}.intro-wrapper[data-v-253ce43f]{display:flex;flex-direction:row;gap:2rem}@media(max-width:768px){.intro-wrapper[data-v-253ce43f]{flex-direction:column;gap:1.5rem}}.intro-title[data-v-253ce43f]{font-size:1.5rem;font-weight:600;margin-bottom:1.5rem;color:#333;position:relative;z-index:1}.intro-content[data-v-253ce43f]{position:relative;z-index:1;flex:1}.intro-content p[data-v-253ce43f]{margin-bottom:1rem;line-height:1.6;color:#555}.intro-content p[data-v-253ce43f]:last-child{margin-bottom:0}.contact-author[data-v-253ce43f]{display:flex;flex-direction:column;align-items:center;justify-content:center}.contact-author .qrcode-box[data-v-253ce43f]{width:120px;height:120px;border-radius:8px;padding:8px;background-color:#fff;box-shadow:0 2px 8px rgba(0,0,0,.1);margin-bottom:.8rem}.contact-author .qrcode-box .qrcode-img[data-v-253ce43f]{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.contact-author .contact-title[data-v-253ce43f]{font-weight:500;color:#444;text-align:center}.donation-section[data-v-253ce43f]{background-color:#fff;border-radius:10px;padding:2rem;margin-bottom:3rem;text-align:center;box-shadow:0 4px 15px rgba(0,0,0,.08)}.section-title[data-v-253ce43f]{font-size:1.5rem;font-weight:600;margin-bottom:1rem;color:#333}.donation-desc[data-v-253ce43f]{margin-bottom:2rem;max-width:600px;margin-left:auto;margin-right:auto;color:#555}.qrcode-container[data-v-253ce43f]{display:flex;justify-content:center;gap:3rem;flex-wrap:wrap}.qrcode-item[data-v-253ce43f]{display:flex;flex-direction:column;align-items:center}.qrcode-box[data-v-253ce43f]{width:150px;height:150px;border-radius:8px;padding:10px;background-color:#fff;box-shadow:0 2px 8px rgba(0,0,0,.1);margin-bottom:1rem}.qrcode-box .qrcode-img[data-v-253ce43f]{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.qrcode-title[data-v-253ce43f]{font-weight:500;color:#444}.timeline-section[data-v-253ce43f]{background-color:#fff;border-radius:10px;padding:2rem;box-shadow:0 4px 15px rgba(0,0,0,.08)}.timeline[data-v-253ce43f]{position:relative;padding-left:2rem}.timeline[data-v-253ce43f]:before{content:"";position:absolute;top:0;bottom:0;left:8px;width:2px;background-color:#e0e0e0}.timeline-month[data-v-253ce43f]{position:relative;margin-bottom:2.5rem}.timeline-month[data-v-253ce43f]:last-child{margin-bottom:0}.month-marker[data-v-253ce43f]{position:absolute;left:-2rem;top:0}.month-marker .month-date[data-v-253ce43f]{display:block;background-color:#3273dc;color:#fff;padding:.5rem 1rem;border-radius:20px;font-weight:600;font-size:.9rem;position:relative;z-index:2;margin-left:2rem}.month-marker[data-v-253ce43f]:before{content:"";position:absolute;width:18px;height:18px;border-radius:50%;background-color:#3273dc;left:0;top:10px;z-index:2}.month-events[data-v-253ce43f]{padding-top:3.5rem}.timeline-event[data-v-253ce43f]{position:relative;padding-left:1.5rem;margin-bottom:2rem}.timeline-event[data-v-253ce43f]:last-child{margin-bottom:0}.timeline-event[data-v-253ce43f]:before{content:"";position:absolute;width:12px;height:12px;border-radius:50%;background-color:#f0f0f0;border:2px solid #3273dc;left:-31px;top:4px;z-index:2}.event-date[data-v-253ce43f]{font-size:.9rem;color:#666;margin-bottom:.5rem;font-weight:500}.event-title[data-v-253ce43f]{font-size:1.1rem;font-weight:600;color:#333;margin-bottom:.5rem}.event-desc[data-v-253ce43f]{color:#555;line-height:1.5}@media(max-width:768px){.page-title[data-v-253ce43f]{font-size:1.6rem;text-align:left}.donation-section[data-v-253ce43f],.intro-card[data-v-253ce43f],.timeline-section[data-v-253ce43f]{padding:1.5rem}.qrcode-container[data-v-253ce43f]{gap:2rem}.timeline[data-v-253ce43f]{padding-left:1rem}.month-marker[data-v-253ce43f]{left:-1rem}.timeline-event[data-v-253ce43f]{padding-left:.5rem}.timeline-event[data-v-253ce43f]:before{left:-15px}} \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index baf0f79..eef7c51 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1 +1 @@ -NEU小站
\ No newline at end of file +NEU小站
\ No newline at end of file diff --git a/dist/js/299.e4540d96.js b/dist/js/299.e4540d96.js deleted file mode 100644 index d262f44..0000000 --- a/dist/js/299.e4540d96.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunknewfront"]=self["webpackChunknewfront"]||[]).push([[299],{2299:function(a,t,v){v.r(t),v.d(t,{default:function(){return f}});var e=v(6768);const d={class:"about-view"};function s(a,t,v,s,i,n){const c=(0,e.g2)("NavBar");return(0,e.uX)(),(0,e.CE)("div",d,[(0,e.bF)(c),t[0]||(t[0]=(0,e.Fv)('

关于我们

关于NEU小站

网站作者也是NEU在读学生,我希望NEU小站的存在能弥补一下校内资源共享的极度空缺,能够给大家的学习帮上忙~有BUG或功能建议,欢迎与我交流!同时感谢且欢迎各位同学投稿资源!

NEU小站承诺永久免费提供服务,网站设置"东币系统"是为了激励投稿,以及一定程度上减少无意义的下载,因为下行流量费很高...

网站主体技术栈包括:Vue、Vuex、Node.js(以Prisma ORM、Nest.js为主),如有同学愿意加入开发,欢迎联系我~

联系作者微信

作者微信

支持我们

网站使用阿里云OSS和CDN服务来保障文件的高可用性和高速传输,每月都产生了较高的下行流量费(下行流量指网站文件流向用户产生的流量)以及CDN加速回源流量费。您为本站捐赠的所有费用都将用于维护网站服务!

微信捐赠码

微信捐助

支付宝捐赠码

支付宝捐助

更新日志

2025.05
2025.05.08

小工具中心上线

新增小工具中心功能;优化了顶部消息样式。

2025.04
2025.04.17

文章页支持Mermaid图表渲染

文章页新增Mermaid图表渲染,支持流程图、时序图、甘特图、类图、状态图、饼图、关系图等,同时优化了编辑器的相关支持。

2025.04.15

消息功能上线

新增消息功能,投稿状态更新、评论点赞、评论回复、添加课程审核更新等将收到消息通知。

2025.04.13

内容页集成课程评分卡片

内容页新增课程评分卡片,与课程评分系统无缝集成,助力全方位阅读体验。同时支持在投稿编辑器中插入课程卡片,轻松引用课程评分系统中的课程数据。

2025.04.11

全新投稿页面上线

投稿功能全新升级,支持Markdown编辑,支持图片编辑、裁剪,支持文章页面内预览编辑内容,支持编辑已通过的投稿内容。

2025.04.09

NEU小站新UI上线公测

使用全新UI响应式框架,大幅提升用户体验。

2025.02
2025.02.24

网站重构正式立项

UI响应式改造计划立项,将网站主体重构为响应式应用。

2025.02.16

新增NEU小站OJ题库

上线NEU小站OJ题库功能,为编程学习提供更多支持。

2025.02.05

课程评分系统升级

课程评分系统新增AI课程总结,接入DeepSeek V3大模型。

2025.01
2025.01.26

东币奖励机制

新增东币奖励机制,付费资源被下载时,投稿者可以获得东币奖励。

2025.01.24

课程评分系统优化

课程评分系统支持删除自己的评论,优化界面和接口性能。

2025.01.16

邮箱验证功能

注册时支持邮箱验证,支持通过stu校园邮箱激活账户。

2024.11
2024.11.27

新评论系统

开发新的评论系统,接入网站用户系统。

2024.11.19

投稿功能优化

优化投稿功能和后台审核功能,增强安全性。

2024.11.17

课程评分系统聊天功能

课程评分系统新增在线聊天功能,支持从评论发起聊天。

2024.09
2024.09.21

必修课评分

课程评分系统新增必修课评分。

2024.09.13

课程评分系统更新

修复课程评分系统的部分Bug,增加课程类别,更新用户验证相关接口。

2024.09.11

课程评分系统上线

课程评分系统上线(测试版)。

2024.09.10

校园内网验证修复

修复通过宽带连接校园内网无法验证的问题,增加学院资源专区。

2024.09.03

API安全性优化

优化Restful API的安全性,优化存储签名机制。

2024.09.01

东币系统更新

更新"东币系统",并接入手机验证码验证。

2024.08
2024.08.31

账户验证功能

更新账户验证功能,防止非NEU师生注册本网站。

2024.08.23

资源合集更新

更新资源合集卡片。

2024.08.10

资源下载安全升级

资源下载采用临时签名URL,防止爬虫。

2024.08.08

安全下载优化

优化安全下载功能。

2024.08.04

编辑器样式优化

优化投稿Markdown编辑器样式。

2024.07
2024.07.28

搜索功能增强

搜索页新增热门关键词。

2024.07.26

草稿功能修复

修复部分情况下加载草稿不展示最新草稿内容的Bug。

2024.07.25

Bug修复与优化

修复了内容详情页面不展示最新头像的Bug,配置并优化资源存储子域名。

2024.07.03

资源系统升级

升级资源内容系统,接入投稿用户系统,升级投稿系统为投稿者中心。

2024.07.02

资源投稿系统

新增资源投稿系统,优化CORS安全机制以保护文件。

2024.06
2024.06.30

资源密码验证优化

优化了资源密码验证机制。

2024.06.29

资源密码保护

增加资源密码保护功能。

2024.06.27

LaTeX支持与头像功能

新增 LaTeX 数学公式支持,新增投稿者头像。

2024.06.24

样式与安全优化

优化首页"新生指南"样式,为网站配置资源防盗链,优化评论区表情稳定性。

2024.06.23

新生指南

新增"新生指南"板块。

2024.06.22

背景图片优化

优化主页背景图片稳定性。

2024.06.20

视觉元素更新

更新主页LOGO,更新404页面样式。

2024.06.19

主页样式更新

更新网站主页样式(电脑端和手机端),更新主页按钮样式。

2024.06.18

多项功能优化

更新网站图标,评论区启用贴吧表情,优化投稿作者样式,优化网站夜间模式样式,新增"认证投稿者"标识,优化日期显示格式,优化帖子样式,更新评论区样式,添加优质资源标识。

2024.06.17

评论区与底部优化

优化评论区样式,网站底部新增二维码。

2024.06.16

评论系统优化

优化评论系统,采用免登录模式,完善资源共享协议内容。

2024.06.15

多项功能更新

新增资源共享协议,修复网站资源完整性问题,修复搜索不显示结果的bug,优化网站移动端样式,修复网站换行符编码引起的bug,添加评论系统。

2024.06.14

网站创建

创建网站,新增页面内预览PDF。

',1))])}var i=v(6674),n={name:"AboutView",components:{NavBar:i.A},created(){document.title="关于我们 - NEU小站"}},c=v(1241);const l=(0,c.A)(n,[["render",s],["__scopeId","data-v-94423fa8"]]);var f=l}}]); -//# sourceMappingURL=299.e4540d96.js.map \ No newline at end of file diff --git a/dist/js/851.d90b5d58.js b/dist/js/851.d90b5d58.js new file mode 100644 index 0000000..9a05799 --- /dev/null +++ b/dist/js/851.d90b5d58.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunknewfront"]=self["webpackChunknewfront"]||[]).push([[851],{8851:function(e,a,t){t.r(a),t.d(a,{default:function(){return f}});var v=t(6768);const d={class:"about-view"};function c(e,a,t,c,s,i){const n=(0,v.g2)("NavBar");return(0,v.uX)(),(0,v.CE)("div",d,[(0,v.bF)(n),a[0]||(a[0]=(0,v.Fv)('

关于我们

关于NEU小站

网站作者也是NEU在读学生,我希望NEU小站的存在能弥补一下校内资源共享的极度空缺,能够给大家的学习帮上忙~有BUG或功能建议,欢迎与我交流!同时感谢且欢迎各位同学投稿资源!

NEU小站目前所有服务均为免费提供,网站设置"东币系统"是为了激励投稿,以及一定程度上减少无意义的下载,因为下行流量费很高...

网站主体技术栈包括:Vue、Vuex、Node.js(以Prisma ORM、Nest.js为主),如有同学愿意加入开发,欢迎联系我~

联系作者微信

作者微信

支持我们

网站使用阿里云OSS和CDN服务来保障文件的高可用性和高速传输,每月都产生了较高的下行流量费(下行流量指网站文件流向用户产生的流量)以及CDN加速回源流量费。您为本站捐赠的所有费用都将用于维护网站服务!

微信捐赠码

微信捐助

支付宝捐赠码

支付宝捐助

更新日志

2025.05
2025.05.08

小工具中心上线

新增小工具中心功能;优化了顶部消息样式。

2025.04
2025.04.17

文章页支持Mermaid图表渲染

文章页新增Mermaid图表渲染,支持流程图、时序图、甘特图、类图、状态图、饼图、关系图等,同时优化了编辑器的相关支持。

2025.04.15

消息功能上线

新增消息功能,投稿状态更新、评论点赞、评论回复、添加课程审核更新等将收到消息通知。

2025.04.13

内容页集成课程评分卡片

内容页新增课程评分卡片,与课程评分系统无缝集成,助力全方位阅读体验。同时支持在投稿编辑器中插入课程卡片,轻松引用课程评分系统中的课程数据。

2025.04.11

全新投稿页面上线

投稿功能全新升级,支持Markdown编辑,支持图片编辑、裁剪,支持文章页面内预览编辑内容,支持编辑已通过的投稿内容。

2025.04.09

NEU小站新UI上线公测

使用全新UI响应式框架,大幅提升用户体验。

2025.02
2025.02.24

网站重构正式立项

UI响应式改造计划立项,将网站主体重构为响应式应用。

2025.02.16

新增NEU小站OJ题库

上线NEU小站OJ题库功能,为编程学习提供更多支持。

2025.02.05

课程评分系统升级

课程评分系统新增AI课程总结,接入DeepSeek V3大模型。

2025.01
2025.01.26

东币奖励机制

新增东币奖励机制,付费资源被下载时,投稿者可以获得东币奖励。

2025.01.24

课程评分系统优化

课程评分系统支持删除自己的评论,优化界面和接口性能。

2025.01.16

邮箱验证功能

注册时支持邮箱验证,支持通过stu校园邮箱激活账户。

2024.11
2024.11.27

新评论系统

开发新的评论系统,接入网站用户系统。

2024.11.19

投稿功能优化

优化投稿功能和后台审核功能,增强安全性。

2024.11.17

课程评分系统聊天功能

课程评分系统新增在线聊天功能,支持从评论发起聊天。

2024.09
2024.09.21

必修课评分

课程评分系统新增必修课评分。

2024.09.13

课程评分系统更新

修复课程评分系统的部分Bug,增加课程类别,更新用户验证相关接口。

2024.09.11

课程评分系统上线

课程评分系统上线(测试版)。

2024.09.10

校园内网验证修复

修复通过宽带连接校园内网无法验证的问题,增加学院资源专区。

2024.09.03

API安全性优化

优化Restful API的安全性,优化存储签名机制。

2024.09.01

东币系统更新

更新"东币系统",并接入手机验证码验证。

2024.08
2024.08.31

账户验证功能

更新账户验证功能,防止非NEU师生注册本网站。

2024.08.23

资源合集更新

更新资源合集卡片。

2024.08.10

资源下载安全升级

资源下载采用临时签名URL,防止爬虫。

2024.08.08

安全下载优化

优化安全下载功能。

2024.08.04

编辑器样式优化

优化投稿Markdown编辑器样式。

2024.07
2024.07.28

搜索功能增强

搜索页新增热门关键词。

2024.07.26

草稿功能修复

修复部分情况下加载草稿不展示最新草稿内容的Bug。

2024.07.25

Bug修复与优化

修复了内容详情页面不展示最新头像的Bug,配置并优化资源存储子域名。

2024.07.03

资源系统升级

升级资源内容系统,接入投稿用户系统,升级投稿系统为投稿者中心。

2024.07.02

资源投稿系统

新增资源投稿系统,优化CORS安全机制以保护文件。

2024.06
2024.06.30

资源密码验证优化

优化了资源密码验证机制。

2024.06.29

资源密码保护

增加资源密码保护功能。

2024.06.27

LaTeX支持与头像功能

新增 LaTeX 数学公式支持,新增投稿者头像。

2024.06.24

样式与安全优化

优化首页"新生指南"样式,为网站配置资源防盗链,优化评论区表情稳定性。

2024.06.23

新生指南

新增"新生指南"板块。

2024.06.22

背景图片优化

优化主页背景图片稳定性。

2024.06.20

视觉元素更新

更新主页LOGO,更新404页面样式。

2024.06.19

主页样式更新

更新网站主页样式(电脑端和手机端),更新主页按钮样式。

2024.06.18

多项功能优化

更新网站图标,评论区启用贴吧表情,优化投稿作者样式,优化网站夜间模式样式,新增"认证投稿者"标识,优化日期显示格式,优化帖子样式,更新评论区样式,添加优质资源标识。

2024.06.17

评论区与底部优化

优化评论区样式,网站底部新增二维码。

2024.06.16

评论系统优化

优化评论系统,采用免登录模式,完善资源共享协议内容。

2024.06.15

多项功能更新

新增资源共享协议,修复网站资源完整性问题,修复搜索不显示结果的bug,优化网站移动端样式,修复网站换行符编码引起的bug,添加评论系统。

2024.06.14

网站创建

创建网站,新增页面内预览PDF。

',1))])}var s=t(6674),i={name:"AboutView",components:{NavBar:s.A},created(){document.title="关于我们 - NEU小站"}},n=t(1241);const l=(0,n.A)(i,[["render",c],["__scopeId","data-v-253ce43f"]]);var f=l}}]); +//# sourceMappingURL=851.d90b5d58.js.map \ No newline at end of file diff --git a/dist/js/app.c4f97ed8.js b/dist/js/app.0b97a982.js similarity index 96% rename from dist/js/app.c4f97ed8.js rename to dist/js/app.0b97a982.js index 651b6c9..3a359c2 100644 --- a/dist/js/app.c4f97ed8.js +++ b/dist/js/app.0b97a982.js @@ -1,2 +1,2 @@ -(function(){"use strict";var e={2090:function(e,t,s){s.d(t,{A:function(){return f}});s(4114);var a=s(6768),n=s(5130),o=s(4232);const i={class:"bar-message-text"};function r(e,t,s,r,c,l){return(0,a.uX)(),(0,a.Wv)(n.eB,{name:"bar-message-fade"},{default:(0,a.k6)((()=>[c.visible?((0,a.uX)(),(0,a.CE)("div",{key:0,class:"bar-message",style:(0,o.Tr)(l.positionStyle)},[(0,a.Lk)("div",{class:(0,o.C4)(["bar-message-content",c.customColor?"":c.type]),style:(0,o.Tr)({backgroundColor:c.customColor})},[c.showIcon?((0,a.uX)(),(0,a.CE)("i",{key:0,class:(0,o.C4)(["bar-message-icon",l.iconClass])},null,2)):(0,a.Q3)("",!0),(0,a.Lk)("span",i,(0,o.v_)(c.message),1),c.showClose?((0,a.uX)(),(0,a.CE)("i",{key:1,class:"bar-message-close fas fa-times",onClick:t[0]||(t[0]=(...e)=>l.close&&l.close(...e))})):(0,a.Q3)("",!0)],6)],4)):(0,a.Q3)("",!0)])),_:1})}var c={name:"BarMessage",data(){return{visible:!1,message:"",type:"success",customColor:"",timer:null,duration:3e3,position:"top",showIcon:!0,showClose:!1}},computed:{positionStyle(){return"bottom"===this.position?{top:"auto",bottom:"16px"}:"center"===this.position?{top:"50%",transform:"translate(-50%, -50%)"}:{top:"16px",bottom:"auto"}},iconClass(){switch(this.type){case"success":return"fas fa-check-circle";case"error":return"fas fa-times-circle";case"warning":return"fas fa-exclamation-circle";case"info":return"fas fa-info-circle";default:return"fas fa-bell"}}},methods:{show(e){this.timer&&clearTimeout(this.timer),this.message=e.message||"",this.type=e.type||"success",this.customColor=e.color||"",this.duration=void 0!==e.duration?e.duration:3e3,this.position=e.position||"top",this.showIcon=void 0===e.showIcon||e.showIcon,this.showClose=void 0!==e.showClose&&e.showClose,this.visible=!0,this.duration>0&&(this.timer=setTimeout((()=>{this.close()}),this.duration))},close(){this.visible=!1,this.timer&&(clearTimeout(this.timer),this.timer=null),this.onClose&&this.onClose()}}},l=s(1241);const d=(0,l.A)(c,[["render",r],["__scopeId","data-v-18bdfd8a"]]);var u=d;const h=[];let p=1;const g=function(e){"string"===typeof e&&(e={message:e}),e=e||{};const t="bar_message_"+p++,s=document.createElement("div"),o=e.onClose;e.onClose=()=>{m(t,o)};const i=(0,a.bF)(u,e);(0,n.XX)(i,s),document.body.appendChild(s);const r=i.component.proxy;r.show(e);const c={id:t,vnode:i,vm:r,container:s};return h.push(c),{close:()=>{r.close()}}};function m(e,t){const s=h.findIndex((t=>t.id===e));if(-1===s)return;const{vm:a,container:o}=h[s];a&&("function"===typeof t&&t(),(0,n.XX)(null,o),document.body.removeChild(o),h.splice(s,1))}["success","error","warning","info"].forEach((e=>{g[e]=t=>("string"===typeof t?t={message:t,type:e}:(t=t||{},t.type=e),g(t))})),g.permanent=e=>("string"===typeof e&&(e={message:e}),e=e||{},e.duration=0,e.showClose=!1!==e.showClose,g(e)),g.closeAll=function(){for(let e=h.length-1;e>=0;e--)h[e].vm.close()};var f=g},4529:function(e,t,s){var a=s(5130),n=s(6768);const o={id:"app"},i={class:"beian-footer"},r={class:"container"},c={class:"copyright"};function l(e,t){const s=(0,n.g2)("router-view"),a=(0,n.g2)("router-link");return(0,n.uX)(),(0,n.CE)("div",o,[(0,n.bF)(s),(0,n.Lk)("footer",i,[(0,n.Lk)("div",r,[t[2]||(t[2]=(0,n.Lk)("span",{style:{"white-space":"nowrap"}},[(0,n.Lk)("img",{src:"https://beian.mps.gov.cn/web/assets/logo01.6189a29f.png",alt:"公安标识",style:{"vertical-align":"middle",height:"16px",display:"inline-block"}}),(0,n.Lk)("a",{href:"https://beian.mps.gov.cn/",target:"_blank"}," 赣公网安备36090202000259号"),(0,n.eW)("  |  "),(0,n.Lk)("a",{href:"https://beian.miit.gov.cn/",target:"_blank"},"赣ICP备2024039267号-1")],-1)),(0,n.Lk)("div",c,[t[1]||(t[1]=(0,n.eW)(" © 2025 ")),(0,n.bF)(a,{to:"/about"},{default:(0,n.k6)((()=>t[0]||(t[0]=[(0,n.eW)("NEU小站")]))),_:1})])])])])}var d=s(1241);const u={},h=(0,d.A)(u,[["render",l]]);var p=h,g=s(1387);const m={class:"home"},f={class:"container"},v={class:"welcome-section"},k={class:"quick-links"};function b(e,t,s,a,o,i){const r=(0,n.g2)("Navbar");return(0,n.uX)(),(0,n.CE)("div",m,[(0,n.bF)(r),(0,n.Lk)("div",f,[(0,n.Lk)("div",v,[t[2]||(t[2]=(0,n.Lk)("img",{alt:"Vue logo",src:"https://download.东北大学.com/images/logo-hd.png"},null,-1)),t[3]||(t[3]=(0,n.Lk)("h1",null,"欢迎访问NEU小站",-1)),(0,n.Lk)("div",k,[t[1]||(t[1]=(0,n.Lk)("span",null,"快速入口:",-1)),(0,n.Lk)("a",{onClick:t[0]||(t[0]=e=>i.goTo("course",!0)),target:"_blank"},"课程评分系统")]),t[4]||(t[4]=(0,n.Lk)("div",{class:"intro-text"},[(0,n.Lk)("p",null,"“哈哈,恭喜你发现了宝藏,让我在接下来的日子里陪你一起成长吧”"),(0,n.Lk)("p",{style:{"text-align":"right"}},"——NEU小站")],-1))])])])}var y=s(6674),C=s(4993),w={name:"HomeView",components:{Navbar:y.A},created(){document.title="NEU小站"},methods:{goTo(e,t=!1){const s={course:"https://course.xn--xhq44jb2fzpc.com",oj:"https://oj.xn--xhq44jb2fzpc.com"},a=s[e];if(a)if(t){const e=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<768;e?C.A.confirm("推荐在电脑端访问,以获得最佳体验。仍要继续吗?","提示").then((()=>{window.open(a,"_blank")})).catch((()=>{})):window.open(a,"_blank")}else window.open(a,"_blank");else console.error(`No URL found for name: ${e}`)}}};const L=(0,d.A)(w,[["render",b],["__scopeId","data-v-5a2476b6"]]);var E=L,_=s(4130),A=s.n(_);A().configure({showSpinner:!1});const M=[{path:"/",name:"home",component:E},{path:"/login",name:"login",component:()=>s.e(612).then(s.bind(s,6612))},{path:"/article/:id",name:"article-detail",component:()=>s.e(665).then(s.bind(s,665))},{path:"/about",name:"about",component:()=>s.e(299).then(s.bind(s,2299))},{path:"/strategy",name:"strategy",component:()=>s.e(181).then(s.bind(s,8181))},{path:"/resources",name:"resources",component:()=>s.e(690).then(s.bind(s,9690))},{path:"/:pathMatch(.*)*",name:"404",component:()=>s.e(899).then(s.bind(s,3899))},{path:"/search",name:"search",component:()=>s.e(368).then(s.bind(s,7368))},{path:"/user-center",name:"user-center",component:()=>s.e(612).then(s.bind(s,6612))},{path:"/app",name:"app",component:()=>s.e(270).then(s.bind(s,9270))},{path:"/submit",name:"submit",component:()=>s.e(312).then(s.bind(s,312))},{path:"/preview",name:"preview",component:()=>s.e(665).then(s.bind(s,665))},{path:"/edit",name:"edit-article",component:()=>s.e(312).then(s.bind(s,312))},{path:"/widgets",name:"widgets",component:()=>s.e(155).then(s.bind(s,5155))},{path:"/widgets/webvpn",name:"webvpn",component:()=>s.e(898).then(s.bind(s,898))}],x=(0,g.aE)({history:(0,g.LA)("/"),routes:M});x.beforeEach(((e,t,s)=>{A().start(),s()})),x.afterEach((()=>{A().done()}));var I=x,S=s(2090);const X=(0,a.Ef)(p);X.config.globalProperties.$barMessage=S.A,X.use(I).mount("#app"),window.$barMessage=S.A},4993:function(e,t,s){s.d(t,{A:function(){return k}});var a=s(5130),n=s(6768),o=s(4232);const i={class:"message-box"},r={key:0,class:"message-header"},c={class:"message-content"},l={key:0,class:"input-wrapper"},d=["type","placeholder"],u={class:"message-footer"};function h(e,t,s,h,p,g){return(0,n.uX)(),(0,n.Wv)(a.eB,{name:"message-fade"},{default:(0,n.k6)((()=>[s.visible?((0,n.uX)(),(0,n.CE)("div",{key:0,class:"message-overlay",onClick:t[4]||(t[4]=(0,a.D$)(((...e)=>g.handleOverlayClick&&g.handleOverlayClick(...e)),["self"]))},[(0,n.Lk)("div",i,[s.title?((0,n.uX)(),(0,n.CE)("div",r,[(0,n.Lk)("h3",null,(0,o.v_)(s.title),1)])):(0,n.Q3)("",!0),(0,n.Lk)("div",c,[(0,n.Lk)("p",null,(0,o.v_)(s.message),1),s.showInput?((0,n.uX)(),(0,n.CE)("div",l,[(0,n.bo)((0,n.Lk)("input",{"onUpdate:modelValue":t[0]||(t[0]=e=>p.localInputValue=e),type:s.inputType,placeholder:s.inputPlaceholder,class:"message-input",onKeyup:t[1]||(t[1]=(0,a.jR)(((...e)=>g.handleConfirm&&g.handleConfirm(...e)),["enter"]))},null,40,d),[[a.hp,p.localInputValue]])])):(0,n.Q3)("",!0)]),(0,n.Lk)("div",u,[g.cancelVisible?((0,n.uX)(),(0,n.CE)("button",{key:0,class:"btn btn-cancel",onClick:t[2]||(t[2]=(...e)=>g.handleCancel&&g.handleCancel(...e))},(0,o.v_)(s.cancelText),1)):(0,n.Q3)("",!0),g.confirmVisible?((0,n.uX)(),(0,n.CE)("button",{key:1,class:"btn btn-confirm",onClick:t[3]||(t[3]=(...e)=>g.handleConfirm&&g.handleConfirm(...e))},(0,o.v_)(s.confirmText),1)):(0,n.Q3)("",!0)])])])):(0,n.Q3)("",!0)])),_:1})}var p={name:"MessageBox",props:{visible:{type:Boolean,default:!1},title:{type:String,default:""},message:{type:String,required:!0},confirm:{type:Boolean,default:!0},cancel:{type:Boolean,default:!1},confirmText:{type:String,default:"确定"},cancelText:{type:String,default:"取消"},closeOnClickOverlay:{type:Boolean,default:!1},showInput:{type:Boolean,default:!1},inputType:{type:String,default:"text"},inputValue:{type:String,default:""},inputPlaceholder:{type:String,default:"请输入"}},data(){return{localInputValue:""}},watch:{inputValue:{immediate:!0,handler(e){this.localInputValue=e}}},computed:{confirmVisible(){return this.confirm},cancelVisible(){return this.cancel}},methods:{handleConfirm(){this.$emit("confirm",this.localInputValue)},handleCancel(){this.$emit("cancel")},handleOverlayClick(){this.closeOnClickOverlay&&this.$emit("cancel")}}},g=s(1241);const m=(0,g.A)(p,[["render",h],["__scopeId","data-v-076938bc"]]);var f=m;const v=(e={})=>new Promise(((t,s)=>{const n=document.createElement("div");document.body.appendChild(n);const o=(0,a.Ef)(f,{...e,visible:!0,confirm:!1!==e.confirm,cancel:!0===e.cancel,onConfirm:e=>{o.unmount(),document.body.removeChild(n),t({value:e,action:"confirm"})},onCancel:()=>{o.unmount(),document.body.removeChild(n),s({action:"cancel"})}});o.mount(n)}));v.alert=(e,t="",s={})=>v({title:t,message:e,confirm:!0,cancel:!1,...s}),v.confirm=(e,t="",s={})=>v({title:t,message:e,confirm:!0,cancel:!0,...s}),v.prompt=(e,t="",s={})=>v({title:t,message:e,showInput:!0,confirm:!0,cancel:!0,...s});var k=v},6674:function(e,t,s){s.d(t,{A:function(){return me}});var a=s(6768),n=s(4232),o=s(5130);const i={class:"navbar"},r={class:"container"},c={class:"navbar-brand"},l={class:"burger-container"},d={key:0,class:"unread-dot burger-badge"},u={class:"navbar-end"},h={key:0,class:"navbar-item user-dropdown",style:{padding:"0"}},p={class:"avatar-wrapper"},g=["src","alt"],m={key:0,class:"unread-dot avatar-badge"},f={class:"user-nickname"},v={class:"dropdown-menu"},k={key:0,class:"unread-dot"},b={key:1,class:"navbar-item"},y={key:0,class:"activation-dialog"},C={class:"activation-dialog-content"},w={class:"activation-methods"},L={class:"activation-method"},E={class:"activation-method"},_={class:"activation-method"},A=["disabled"],M={key:1,class:"message-modal"},x={class:"message-modal-content"},I={class:"message-modal-header"},S={class:"message-modal-body",ref:"messageContainer"},X={key:0,class:"no-messages"},P={key:1,class:"message-list"},j={class:"message-header"},T={class:"message-time"},z={key:0,class:"unread-tag"},W=["innerHTML"],O={key:1,class:"message-content"},U=["href"],q={key:1},N={key:2,class:"message-content"},D=["href"],F={key:1},V={key:3,class:"message-content"},$=["href"],B={key:1},Q={key:4,class:"message-content"},R={key:5,class:"message-content"},J=["href"],Z={key:1},G={key:6,class:"message-content"},H=["href"],K={key:1},Y={key:7,class:"message-content"},ee=["href"],te={key:1},se={key:8,class:"message-content"},ae={key:2,class:"pagination"},ne=["disabled"],oe={class:"page-info"},ie=["disabled"];function re(e,t,s,re,ce,le){const de=(0,a.g2)("router-link");return(0,a.uX)(),(0,a.CE)("nav",i,[(0,a.Lk)("div",r,[(0,a.Lk)("div",c,[(0,a.bF)(de,{to:"/",class:"navbar-logo"},{default:(0,a.k6)((()=>[t[14]||(t[14]=(0,a.Lk)("img",{src:"https://download.xn--xhq44jb2fzpc.com/images/logo-hd.png",alt:"NEU小站",class:"navbar-logo-img"},null,-1)),t[15]||(t[15]=(0,a.Lk)("span",null,"NEU小站",-1)),le.currentTagConfig?((0,a.uX)(),(0,a.CE)("span",{key:0,style:(0,n.Tr)({backgroundColor:le.currentTagConfig.backgroundColor}),class:"route-tag"},(0,n.v_)(le.currentTagConfig.text),5)):(0,a.Q3)("",!0)])),_:1}),(0,a.Lk)("div",l,[(0,a.Lk)("div",{class:(0,n.C4)(["navbar-burger",{"is-active":ce.isMenuActive}]),onClick:t[0]||(t[0]=(...e)=>le.toggleMenu&&le.toggleMenu(...e))},t[16]||(t[16]=[(0,a.Lk)("span",null,null,-1),(0,a.Lk)("span",null,null,-1),(0,a.Lk)("span",null,null,-1)]),2),ce.userInfo&&ce.userInfo.messageUnread?((0,a.uX)(),(0,a.CE)("span",d)):(0,a.Q3)("",!0)])]),(0,a.Lk)("div",{class:(0,n.C4)(["navbar-menu",{"is-active":ce.isMenuActive}])},[(0,a.Lk)("div",u,[(0,a.bF)(de,{to:"/",class:"navbar-item"},{default:(0,a.k6)((()=>t[17]||(t[17]=[(0,a.eW)("首页")]))),_:1}),(0,a.bF)(de,{to:"/strategy",class:"navbar-item"},{default:(0,a.k6)((()=>t[18]||(t[18]=[(0,a.eW)("攻略指南")]))),_:1}),(0,a.bF)(de,{to:"/resources",class:"navbar-item"},{default:(0,a.k6)((()=>t[19]||(t[19]=[(0,a.eW)("资源共享")]))),_:1}),(0,a.bF)(de,{to:"/app",class:"navbar-item"},{default:(0,a.k6)((()=>t[20]||(t[20]=[(0,a.eW)("应用中心")]))),_:1}),(0,a.bF)(de,{to:"/widgets",class:"navbar-item"},{default:(0,a.k6)((()=>t[21]||(t[21]=[(0,a.eW)("小工具")]))),_:1}),(0,a.bF)(de,{to:"/about",class:"navbar-item"},{default:(0,a.k6)((()=>t[22]||(t[22]=[(0,a.eW)("关于")]))),_:1}),(0,a.bF)(de,{to:"/search",class:"navbar-item"},{default:(0,a.k6)((()=>t[23]||(t[23]=[(0,a.eW)("搜索")]))),_:1}),ce.userInfo?((0,a.uX)(),(0,a.CE)("div",h,[(0,a.Lk)("div",{class:"user-info",onClick:t[1]||(t[1]=(...e)=>le.toggleDropdown&&le.toggleDropdown(...e))},[(0,a.Lk)("div",p,[(0,a.Lk)("img",{src:ce.userInfo.avatar_path,class:"user-avatar",alt:ce.userInfo.nickname},null,8,g),ce.userInfo.messageUnread?((0,a.uX)(),(0,a.CE)("span",m)):(0,a.Q3)("",!0)]),(0,a.Lk)("span",f,(0,n.v_)(ce.userInfo.nickname),1),(0,a.Lk)("span",{class:(0,n.C4)(["dropdown-arrow",{"is-active":ce.isDropdownActive}])},"▼",2)]),(0,a.bo)((0,a.Lk)("div",v,[(0,a.Lk)("div",{class:"dropdown-item",onClick:t[2]||(t[2]=(...e)=>le.handleUserCenter&&le.handleUserCenter(...e))},"个人中心"),(0,a.Lk)("div",{class:"dropdown-item",onClick:t[3]||(t[3]=(...e)=>le.handleMessages&&le.handleMessages(...e))},[t[24]||(t[24]=(0,a.eW)(" 我的消息 ")),ce.userInfo.messageUnread?((0,a.uX)(),(0,a.CE)("span",k)):(0,a.Q3)("",!0)]),(0,a.Lk)("div",{class:"dropdown-item",onClick:t[4]||(t[4]=(...e)=>le.handleLogout&&le.handleLogout(...e))},"退出登录")],512),[[o.aG,ce.isDropdownActive]])])):((0,a.uX)(),(0,a.CE)("div",b,[(0,a.Lk)("a",{class:"login-btn",onClick:t[5]||(t[5]=(...e)=>le.handleLogin&&le.handleLogin(...e))},"登录")]))])],2)]),ce.showActivationDialog?((0,a.uX)(),(0,a.CE)("div",y,[(0,a.Lk)("div",C,[t[31]||(t[31]=(0,a.Lk)("h3",null,"账户激活",-1)),t[32]||(t[32]=(0,a.Lk)("p",null,"您的账户尚未激活,请选择以下一种方式进行激活。如果无法激活,请退出登录后在“关于”页面联系网站管理员。",-1)),(0,a.Lk)("div",w,[(0,a.Lk)("div",L,[t[25]||(t[25]=(0,a.Lk)("h4",null,"方式 1:NEU 校园网验证",-1)),t[26]||(t[26]=(0,a.Lk)("p",null,"请连接 NEU 校园网后点击下面的验证按钮(暂不支持秦皇岛分校)",-1)),(0,a.Lk)("button",{onClick:t[6]||(t[6]=(...e)=>le.handleNetworkVerify&&le.handleNetworkVerify(...e)),class:"verify-btn"},"校园网验证")]),(0,a.Lk)("div",E,[t[27]||(t[27]=(0,a.Lk)("h4",null,"方式 2:校园邮箱验证",-1)),t[28]||(t[28]=(0,a.Lk)("p",null,"使用 @stu.neu.edu.cn、@stu.neuq.edu.cn 或 @mails.neu.edu.cn 后缀的校园邮箱验证",-1)),(0,a.Lk)("button",{onClick:t[7]||(t[7]=(...e)=>le.handleEmailVerify&&le.handleEmailVerify(...e)),class:"verify-btn"},"邮箱验证")]),(0,a.Lk)("div",_,[t[29]||(t[29]=(0,a.Lk)("h4",null,"方式 3:学生证照片认证",-1)),t[30]||(t[30]=(0,a.Lk)("p",null,[(0,a.eW)("请上传清晰、无遮挡的学生证(校园卡,"),(0,a.Lk)("strong",null,"非火车票学生证"),(0,a.eW)(")个人信息面照片,并清晰露出公章(支持JPG/PNG/WEBP格式,不超过5M)")],-1)),(0,a.Lk)("input",{type:"file",onChange:t[8]||(t[8]=(...e)=>le.handleFileSelect&&le.handleFileSelect(...e)),accept:"image/jpeg,image/png,image/webp",ref:"fileInput",style:{display:"none"}},null,544),(0,a.Lk)("button",{onClick:t[9]||(t[9]=(...e)=>le.triggerFileInput&&le.triggerFileInput(...e)),class:"verify-btn",disabled:ce.isUploading},(0,n.v_)(ce.isUploading?"上传认证中...":"上传学生证"),9,A)])]),(0,a.Lk)("button",{onClick:t[10]||(t[10]=(...e)=>le.handleLogout&&le.handleLogout(...e)),class:"close-btn"},"退出登录")])])):(0,a.Q3)("",!0),ce.showMessageModal?((0,a.uX)(),(0,a.CE)("div",M,[(0,a.Lk)("div",x,[(0,a.Lk)("div",I,[t[33]||(t[33]=(0,a.Lk)("h3",null,"我的消息",-1)),(0,a.Lk)("span",{class:"close-icon",onClick:t[11]||(t[11]=(...e)=>le.closeMessageModal&&le.closeMessageModal(...e))},"×")]),(0,a.Lk)("div",S,[0===ce.messages.length?((0,a.uX)(),(0,a.CE)("div",X," 暂无消息 ")):((0,a.uX)(),(0,a.CE)("div",P,[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(ce.messages,(e=>((0,a.uX)(),(0,a.CE)("div",{key:e.id,class:"message-item"},[(0,a.Lk)("div",j,[(0,a.Lk)("span",T,(0,n.v_)(le.formatDate(e.created_at)),1),e.status?(0,a.Q3)("",!0):((0,a.uX)(),(0,a.CE)("span",z,"未读"))]),0===e.type?((0,a.uX)(),(0,a.CE)("div",{key:0,class:"message-content",innerHTML:e.content},null,8,W)):1===e.type?((0,a.uX)(),(0,a.CE)("div",O,[t[34]||(t[34]=(0,a.eW)(" 您在《")),e.article_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://www.xn--xhq44jb2fzpc.com/article/"+e.article_id,target:"_blank"},(0,n.v_)(e.article_title),9,U)):((0,a.uX)(),(0,a.CE)("span",q,(0,n.v_)(e.article_title),1)),(0,a.eW)("》内容下的「"+(0,n.v_)(e.original_content)+"」评论被回复:「"+(0,n.v_)(e.reply_content)+"」 ",1)])):2===e.type?((0,a.uX)(),(0,a.CE)("div",N,[t[35]||(t[35]=(0,a.eW)(" 您的投稿《")),e.article_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://www.xn--xhq44jb2fzpc.com/article/"+e.article_id,target:"_blank"},(0,n.v_)(e.title),9,D)):((0,a.uX)(),(0,a.CE)("span",F,(0,n.v_)(e.title),1)),(0,a.eW)("》审核"+(0,n.v_)(e.pass?"已通过":"未通过")+(0,n.v_)(e.note?",审核备注:"+e.note:""),1)])):3===e.type?((0,a.uX)(),(0,a.CE)("div",V,[t[36]||(t[36]=(0,a.eW)(' 您添加的课程"')),e.course_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://course.xn--xhq44jb2fzpc.com/courses?c="+le.encodeBase64(e.course_id),target:"_blank"},(0,n.v_)(e.course_name),9,$)):((0,a.uX)(),(0,a.CE)("span",B,(0,n.v_)(e.course_name),1)),(0,a.eW)('"审核'+(0,n.v_)(e.course_status),1)])):4===e.type?((0,a.uX)(),(0,a.CE)("div",Q," 您的密钥「"+(0,n.v_)(e.key_plaintext)+"」使用次数已用尽,继续投稿可获得新的密钥。 ",1)):5===e.type?((0,a.uX)(),(0,a.CE)("div",R,[t[37]||(t[37]=(0,a.eW)(" 您在《")),e.article_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://www.xn--xhq44jb2fzpc.com/article/"+e.article_id,target:"_blank"},(0,n.v_)(e.article_title),9,J)):((0,a.uX)(),(0,a.CE)("span",Z,(0,n.v_)(e.article_title),1)),(0,a.eW)("》内容下的「"+(0,n.v_)(e.content)+"」评论被点赞。 ",1)])):6===e.type?((0,a.uX)(),(0,a.CE)("div",G,[t[38]||(t[38]=(0,a.eW)(" 您的内容《")),e.article_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://www.xn--xhq44jb2fzpc.com/article/"+e.article_id,target:"_blank"},(0,n.v_)(e.article_title),9,H)):((0,a.uX)(),(0,a.CE)("span",K,(0,n.v_)(e.article_title),1)),(0,a.eW)("》收到新评论:「"+(0,n.v_)(e.comment_content)+"」 ",1)])):7===e.type?((0,a.uX)(),(0,a.CE)("div",Y,[t[39]||(t[39]=(0,a.eW)(" 恭喜您的内容《")),e.article_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://www.xn--xhq44jb2fzpc.com/article/"+e.article_id,target:"_blank"},(0,n.v_)(e.article_title),9,ee)):((0,a.uX)(),(0,a.CE)("span",te,(0,n.v_)(e.article_title),1)),(0,a.eW)("》浏览量达到"+(0,n.v_)(e.view_count)+",感谢您为NEU小站贡献优质内容,小站因为有你而更加精彩~ ",1)])):((0,a.uX)(),(0,a.CE)("div",se,(0,n.v_)(e.error||"未知消息类型"),1))])))),128))])),ce.totalPages>1?((0,a.uX)(),(0,a.CE)("div",ae,[(0,a.Lk)("button",{disabled:1===ce.currentPage,onClick:t[12]||(t[12]=e=>le.loadMessages(ce.currentPage-1)),class:"page-btn"},"上一页",8,ne),(0,a.Lk)("span",oe,(0,n.v_)(ce.currentPage)+" / "+(0,n.v_)(ce.totalPages),1),(0,a.Lk)("button",{disabled:ce.currentPage===ce.totalPages,onClick:t[13]||(t[13]=e=>le.loadMessages(ce.currentPage+1)),class:"page-btn"},"下一页",8,ie)])):(0,a.Q3)("",!0)],512)])])):(0,a.Q3)("",!0)])}s(4114),s(8111),s(116),s(3579),s(4979);var ce=s(8704),le=s(4373),de=s(4993),ue=s(9090),he={name:"NavBar",data(){return{isMenuActive:!1,isDropdownActive:!1,userInfo:null,showActivationDialog:!1,isActivated:!1,isUploading:!1,showMessageModal:!1,messages:[],loading:!1,currentPage:1,totalPages:1,pageSize:10,tagConfigurations:[{text:"应用",backgroundColor:"#ff8c00",routes:["/app","/app/"],wildcard:!1},{text:"工具",backgroundColor:"#3273dc",routes:["/widgets"],wildcard:!0}]}},computed:{currentTagConfig(){const e=this.$route.path;return this.tagConfigurations.find((t=>!!t.routes.includes(e)||!!t.wildcard&&t.routes.some((t=>e===t||e.startsWith(t+"/")))))||null}},mounted(){this.checkLoginStatus()},methods:{handleLogin(){(0,ue.A)().then((e=>{console.log(e),this.checkLoginStatus()})).catch((e=>{console.log(e)}))},toggleMenu(){this.isMenuActive=!this.isMenuActive},toggleDropdown(){this.isDropdownActive=!this.isDropdownActive},handleUserCenter(){this.isDropdownActive=!1,this.$router.push("/user-center")},handleLogout(){const e=window.location.hostname.includes("localhost")?"localhost":window.location.hostname.split(".").slice(-2).join(".");ce.A.remove("token",{domain:e,path:"/"}),this.userInfo=null,window.location.reload()},checkLoginStatus(){const e=ce.A.get("token");e&&le.A.get("https://newfront.xn--xhq44jb2fzpc.com/user/info",{headers:{Authorization:e}}).then((e=>{this.userInfo=e.data,e.data.banned?(this.$barMessage({message:"您的账户已被封禁,请联系网站管理员",type:"error"}),de.A.alert('您的账户已被封禁,如有疑问请在"关于"页面联系网站管理员。',"账户状态异常",{confirmText:"退出登录",cancel:!1}).then((()=>{this.handleLogout()})).catch((()=>{this.handleLogout()}))):(this.isActivated=e.data.activated,this.isActivated||(this.showActivationDialog=!0))})).catch((e=>{console.log(e),this.userInfo=null}))},closeActivationDialog(){this.showActivationDialog=!1},handleNetworkVerify(){const e=ce.A.get("token");e?le.A.get("https://userlogin.xn--xhq44jb2fzpc.com/qv",{headers:{Authorization:e}}).then((e=>{de.A.alert(e.data.message,"提示"),this.isActivated=!0,this.showActivationDialog=!1})).catch((e=>{e.response&&e.response.data?de.A.alert(`${e.response.data.message} 当前IP: ${e.response.data.ip||"未知"}`,"提示"):de.A.alert("验证失败,请稍后重试","提示")})):de.A.alert("您未登录,请先登录后操作!","提示")},handleEmailVerify(){const e=ce.A.get("token");e?le.A.get("https://userlogin.xn--xhq44jb2fzpc.com/check-email",{headers:{Authorization:e}}).then((e=>{de.A.alert(e.data.message,"提示"),this.isActivated=!0,this.showActivationDialog=!1})).catch((t=>{t.response&&403===t.response.status?this.promptForCampusEmail(e):t.response&&t.response.data?de.A.alert(t.response.data.message||"发生未知错误,请稍后重试","提示"):de.A.alert("验证失败,请稍后重试","提示")})):de.A.alert("您未登录,请先登录后操作!","提示")},promptForCampusEmail(e){(0,de.A)({title:"校园邮箱验证",message:"请输入您的校园邮箱:",showInput:!0,inputPlaceholder:"请输入校园邮箱",confirmText:"确认",cancelText:"取消",cancel:!0}).then((({value:t})=>{t?t.endsWith("@stu.neu.edu.cn")||t.endsWith("@stu.neuq.edu.cn")||t.endsWith("@mails.neu.edu.cn")?this.sendCampusVerificationEmail(t,e):de.A.alert("请输入有效的 @stu.neu.edu.cn、@stu.neuq.edu.cn 或 @mails.neu.edu.cn 校园邮箱!","提示"):de.A.alert("邮箱不能为空","提示")})).catch((()=>{}))},sendCampusVerificationEmail(e,t){le.A.post("https://userlogin.xn--xhq44jb2fzpc.com/send-campus-verify",{campus_email:e},{headers:{Authorization:t,"Content-Type":"application/json"}}).then((t=>{de.A.alert(`验证邮件已发送至 ${e},请检查您的邮箱完成验证。`,"提示")})).catch((e=>{e.response&&e.response.data?de.A.alert(`发送验证邮件失败:${e.response.data.message}`,"提示"):de.A.alert("发送验证邮件失败,请稍后重试","提示")}))},handleMessages(){this.isDropdownActive=!1,this.showMessageModal=!0,this.loadMessages(1)},closeMessageModal(){this.showMessageModal=!1,this.checkLoginStatus()},loadMessages(e){this.currentPage=e,le.A.get("https://newfront.xn--xhq44jb2fzpc.com/message/get",{headers:{Authorization:ce.A.get("token")},params:{page:e}}).then((e=>{this.messages=e.data.messages,this.totalPages=e.data.totalPages,this.pageSize=e.data.pageSize})).catch((e=>{console.error("获取消息失败:",e),de.A.alert("获取消息失败,请稍后再试。","错误")}))},formatDate(e){const t=new Date(e);return t.toLocaleDateString()+" "+t.toLocaleTimeString()},encodeBase64(e){return window.btoa(e)},triggerFileInput(){this.$refs.fileInput.click()},async handleFileSelect(e){const t=e.target.files[0];if(!t)return;const s=["image/jpeg","image/png","image/webp"];if(!s.includes(t.type))return void de.A.alert("不支持的文件格式,请上传 JPG, PNG, 或 WEBP 图片。","格式错误");const a=5242880;if(t.size>a)de.A.alert("文件大小不能超过 5MB。","文件过大");else{this.isUploading=!0;try{const e=ce.A.get("token");if(!e)return de.A.alert("您未登录,请先登录后操作!","提示"),void(this.isUploading=!1);const s=await le.A.post("https://newfront.xn--xhq44jb2fzpc.com/freshman/validate_card/get-upload-url",{filename:t.name},{headers:{Authorization:e}}),{uploadUrl:a,objectPath:n}=s.data;await le.A.put(a,t,{headers:{"Content-Type":t.type}});await le.A.post("https://newfront.xn--xhq44jb2fzpc.com/freshman/validate_card/verify",{objectPath:n},{headers:{Authorization:e}});de.A.alert("学生证认证成功!","激活成功"),this.isActivated=!0,this.showActivationDialog=!1,this.checkLoginStatus()}catch(n){let e="操作失败,请稍后重试。";n.response&&n.response.data&&n.response.data.message&&(e=n.response.data.message),de.A.alert(e,"错误")}finally{this.isUploading=!1,this.$refs.fileInput.value=""}}}}},pe=s(1241);const ge=(0,pe.A)(he,[["render",re],["__scopeId","data-v-19edf2fa"]]);var me=ge},9090:function(e,t,s){s.d(t,{A:function(){return A}});var a=s(5130),n=s(6768),o=s(4232);const i={key:0,class:"login-container"},r={class:"login-box"},c={class:"login-header"},l={class:"form-group"},d={class:"form-group"},u={class:"button-group"},h={class:"modal-content"},p={class:"modal-header"},g={class:"modal-body"},m={class:"captcha-instruction"},f={class:"form-group"},v={class:"modal-footer"},k={key:0,class:"loading-overlay"};function b(e,t,s,b,y,C){return s.visible?((0,n.uX)(),(0,n.CE)("div",i,[t[13]||(t[13]=(0,n.Lk)("div",{class:"login-overlay"},null,-1)),(0,n.Lk)("div",r,[(0,n.Lk)("div",c,[t[8]||(t[8]=(0,n.Lk)("h2",{class:"login-title"},"登录/注册",-1)),s.showClose?((0,n.uX)(),(0,n.CE)("button",{key:0,onClick:t[0]||(t[0]=(...e)=>C.handleClose&&C.handleClose(...e)),class:"close-btn"},"×")):(0,n.Q3)("",!0)]),(0,n.Lk)("form",{onSubmit:t[4]||(t[4]=(0,a.D$)(((...e)=>C.handleSubmit&&C.handleSubmit(...e)),["prevent"])),class:"login-form"},[(0,n.Lk)("div",l,[t[9]||(t[9]=(0,n.Lk)("label",{for:"email"},"邮箱",-1)),(0,n.bo)((0,n.Lk)("input",{type:"email",id:"email","onUpdate:modelValue":t[1]||(t[1]=e=>y.email=e),placeholder:"请输入邮箱地址",required:"",class:"form-input",pattern:"[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$",title:"请输入有效的邮箱地址"},null,512),[[a.Jo,y.email]])]),(0,n.Lk)("div",d,[t[10]||(t[10]=(0,n.Lk)("label",{for:"password"},"密码",-1)),(0,n.bo)((0,n.Lk)("input",{type:"password",id:"password","onUpdate:modelValue":t[2]||(t[2]=e=>y.password=e),placeholder:"请输入密码",required:"",class:"form-input"},null,512),[[a.Jo,y.password]])]),y.message?((0,n.uX)(),(0,n.CE)("div",{key:0,class:(0,o.C4)(["message",{error:y.messageIsError,success:!y.messageIsError}])},(0,o.v_)(y.message),3)):(0,n.Q3)("",!0),(0,n.Lk)("div",u,[(0,n.Lk)("button",{type:"button",onClick:t[3]||(t[3]=(...e)=>C.login&&C.login(...e)),class:"btn btn-primary"},"登录/注册")])],32)]),(0,n.Lk)("div",{class:(0,o.C4)(["modal",{show:y.showCaptchaModal}])},[(0,n.Lk)("div",h,[(0,n.Lk)("div",p,[t[11]||(t[11]=(0,n.Lk)("h3",null,"邮箱验证",-1)),(0,n.Lk)("button",{onClick:t[5]||(t[5]=(...e)=>C.closeCaptchaModal&&C.closeCaptchaModal(...e)),class:"close-btn"},"×")]),(0,n.Lk)("div",g,[(0,n.Lk)("p",m,(0,o.v_)(y.captchaInstruction),1),(0,n.Lk)("div",f,[(0,n.bo)((0,n.Lk)("input",{type:"text","onUpdate:modelValue":t[6]||(t[6]=e=>y.captchaCode=e),placeholder:"请输入验证码",class:"form-input"},null,512),[[a.Jo,y.captchaCode]])]),y.captchaMessage?((0,n.uX)(),(0,n.CE)("div",{key:0,class:(0,o.C4)(["captcha-message",{error:y.captchaMessageIsError,success:!y.captchaMessageIsError}])},(0,o.v_)(y.captchaMessage),3)):(0,n.Q3)("",!0)]),(0,n.Lk)("div",v,[(0,n.Lk)("button",{onClick:t[7]||(t[7]=(...e)=>C.verifyCaptcha&&C.verifyCaptcha(...e)),class:"btn btn-primary"},"验证")])])],2),y.loading?((0,n.uX)(),(0,n.CE)("div",k,[t[12]||(t[12]=(0,n.Lk)("div",{class:"spinner"},null,-1)),(0,n.Lk)("p",null,(0,o.v_)(y.loadingMessage),1)])):(0,n.Q3)("",!0)])):(0,n.Q3)("",!0)}var y=s(4993),C={name:"Login",props:{visible:{type:Boolean,default:!0},showClose:{type:Boolean,default:!1},onSuccess:{type:Function,default:null},onClose:{type:Function,default:null}},data(){return{email:"",password:"",message:"",messageIsError:!0,loading:!1,loadingMessage:"加载中...",showCaptchaModal:!1,captchaCode:"",captchaMessage:"",captchaMessageIsError:!0,captchaInstruction:"验证码已发送至您的邮箱,请在下方输入"}},methods:{detectDevice(){const e=navigator.userAgent;return/android/i.test(e)?"Android":/iPad|iPhone|iPod/.test(e)?"iOS":/Windows Phone/i.test(e)?"Windows Phone":/Windows/i.test(e)?"Windows":/Macintosh|Mac OS X/i.test(e)?"macOS":/Linux/i.test(e)?"Linux":"Unknown"},async handleSubmit(){await this.login()},handleClose(){this.onClose?this.onClose():this.$emit("close")},async login(){if(!this.email||!this.password)return this.message="请输入邮箱和密码",void(this.messageIsError=!0);const e=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;if(!e.test(this.email))return this.message="请输入有效的邮箱地址",void(this.messageIsError=!0);this.loading=!0,this.loadingMessage="登录中...";try{const e=await this.loginOrRegister(this.email,this.password,"login");"Login successful."===e.message?this.handleLoginSuccess(e):"User not registered."===e.message?(this.loading=!1,(0,y.A)({title:"邮箱未注册",message:'此邮箱没有注册。点击"发送"按钮将向您的邮箱发送注册验证码。',confirmText:"发送",cancelText:"取消",cancel:!0,closeOnClickOverlay:!0}).then((async()=>{await this.sendRegisterCode()})).catch((()=>{}))):"Invalid email or password."===e.message?(this.message="密码错误。",this.messageIsError=!0,this.loading=!1):(this.message=e.message||"登录失败,请重试。",this.messageIsError=!0,this.loading=!1)}catch(t){console.error("Error:",t),this.message="发生错误,请稍后重试。",this.messageIsError=!0,this.loading=!1}},async register(){if(!this.email||!this.password)return this.message="请输入邮箱和密码",void(this.messageIsError=!0);const e=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;if(!e.test(this.email))return this.message="请输入有效的邮箱地址",void(this.messageIsError=!0);await this.sendRegisterCode()},async sendRegisterCode(){this.loading=!0,this.loadingMessage="发送验证码中...";try{const e=await this.loginOrRegister(this.email,this.password,"register");"Verification email sent."===e.message?(this.captchaInstruction="验证码已发送至您的邮箱,请在下方输入",this.captchaMessage="",this.captchaCode="",this.showCaptchaModal=!0):"A valid code has already been sent. Please try again later."===e.message?(this.captchaInstruction="您还有未验证的验证码,请查看邮箱并在下方输入",this.captchaMessage="",this.captchaCode="",this.showCaptchaModal=!0):"Email is already registered."===e.message?(this.message="此邮箱已注册。",this.messageIsError=!0):(this.message="发送验证码失败,请稍后重试。",this.messageIsError=!0),this.loading=!1}catch(e){console.error("Error:",e),this.message="发生错误,请稍后重试。",this.messageIsError=!0,this.loading=!1}},async verifyCaptcha(){if(!this.captchaCode)return this.captchaMessage="请输入验证码",void(this.captchaMessageIsError=!0);try{const e=await this.verifyRegisterCode(this.email,this.captchaCode);"User registered successfully."===e.message?(this.captchaMessage="验证成功!",this.captchaMessageIsError=!1,setTimeout((()=>{this.closeCaptchaModal(),this.handleSuccessfulRegistration()}),1500)):(this.captchaMessage="您的验证码不正确",this.captchaMessageIsError=!0)}catch(e){console.error("Error:",e),this.captchaMessage="验证过程中发生错误,请重试",this.captchaMessageIsError=!0}},closeCaptchaModal(){this.showCaptchaModal=!1,this.captchaCode="",this.captchaMessage=""},async handleSuccessfulRegistration(){this.message="注册成功!正在登录...",this.messageIsError=!1,this.loading=!0,this.loadingMessage="登录中...",await this.delay(1e3);try{const e=await this.loginOrRegister(this.email,this.password,"login");"Login successful."===e.message?this.handleLoginSuccess(e):(this.message="注册成功,但自动登录失败,请手动登录。",this.messageIsError=!0,this.loading=!1)}catch(e){console.error("Error during login after registration:",e),this.message="注册成功,但自动登录失败,请手动登录。",this.messageIsError=!0,this.loading=!1}},handleLoginSuccess(e){const t=e.token,s=window.location.hostname.includes("localhost")?"localhost":window.location.hostname.split(".").slice(-2).join(".");document.cookie=`token=${t}; max-age=86340; path=/; domain=${s}; secure; SameSite=Strict`,this.loading=!1,this.message="登录成功!正在加载中...",this.messageIsError=!1;const a={email:this.email,userId:e.id,token:e.token};this.onSuccess&&(this.onSuccess(a),window.location.reload()),this.$emit("login-success",a),this.onClose&&setTimeout((()=>{this.handleClose()}),3e3)},async loginOrRegister(e,t,s){const a="login"===s?"https://userlogin.xn--xhq44jb2fzpc.com/login":"https://userlogin.xn--xhq44jb2fzpc.com/register",n={email:e,password:t};"login"===s&&(n.device=this.detectDevice());const o=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return o.json()},async verifyRegisterCode(e,t){const s="https://userlogin.xn--xhq44jb2fzpc.com/verify-register-code",a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,code:t})});return a.json()},delay(e){return new Promise((t=>setTimeout(t,e)))}}},w=s(1241);const L=(0,w.A)(C,[["render",b],["__scopeId","data-v-66365b1a"]]);var E=L;const _=(e={})=>new Promise(((t,s)=>{const n=document.createElement("div");document.body.appendChild(n);const o=(0,a.Ef)(E,{...e,visible:!0,showClose:!0,onSuccess:e=>{t(e)},onClose:()=>{o.unmount(),document.body.removeChild(n)}});o.mount(n)}));_.withCallback=(e,t={})=>_({...t,onSuccess:t=>{e(t)}});var A=_}},t={};function s(a){var n=t[a];if(void 0!==n)return n.exports;var o=t[a]={exports:{}};return e[a].call(o.exports,o,o.exports,s),o.exports}s.m=e,function(){var e=[];s.O=function(t,a,n,o){if(!a){var i=1/0;for(d=0;d=o)&&Object.keys(s.O).every((function(e){return s.O[e](a[c])}))?a.splice(c--,1):(r=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[a,n,o]}}(),function(){s.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return s.d(t,{a:t}),t}}(),function(){s.d=function(e,t){for(var a in t)s.o(t,a)&&!s.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})}}(),function(){s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce((function(t,a){return s.f[a](e,t),t}),[]))}}(),function(){s.u=function(e){return"js/"+e+"."+{12:"dc7bebdb",155:"e8f96718",181:"a07c9ba6",270:"3e1923a6",299:"e4540d96",312:"451d9778",368:"6fa43fcb",612:"e292fb5a",665:"5c707a2c",690:"2a36b428",898:"24c8f049",899:"3cbdab3e",940:"705f02e8"}[e]+".js"}}(),function(){s.miniCssF=function(e){return"css/"+e+"."+{155:"e92d57c5",181:"8f61b0cf",270:"e032f250",299:"af5d7086",312:"a2ba332f",368:"9ee9e7c3",612:"63433215",665:"677d9f0e",690:"4b505240",898:"6cbcb5bc",899:"35501d47"}[e]+".css"}}(),function(){s.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="newfront:";s.l=function(a,n,o,i){if(e[a])e[a].push(n);else{var r,c;if(void 0!==o)for(var l=document.getElementsByTagName("script"),d=0;d[c.visible?((0,a.uX)(),(0,a.CE)("div",{key:0,class:"bar-message",style:(0,o.Tr)(l.positionStyle)},[(0,a.Lk)("div",{class:(0,o.C4)(["bar-message-content",c.customColor?"":c.type]),style:(0,o.Tr)({backgroundColor:c.customColor})},[c.showIcon?((0,a.uX)(),(0,a.CE)("i",{key:0,class:(0,o.C4)(["bar-message-icon",l.iconClass])},null,2)):(0,a.Q3)("",!0),(0,a.Lk)("span",i,(0,o.v_)(c.message),1),c.showClose?((0,a.uX)(),(0,a.CE)("i",{key:1,class:"bar-message-close fas fa-times",onClick:t[0]||(t[0]=(...e)=>l.close&&l.close(...e))})):(0,a.Q3)("",!0)],6)],4)):(0,a.Q3)("",!0)])),_:1})}var c={name:"BarMessage",data(){return{visible:!1,message:"",type:"success",customColor:"",timer:null,duration:3e3,position:"top",showIcon:!0,showClose:!1}},computed:{positionStyle(){return"bottom"===this.position?{top:"auto",bottom:"16px"}:"center"===this.position?{top:"50%",transform:"translate(-50%, -50%)"}:{top:"16px",bottom:"auto"}},iconClass(){switch(this.type){case"success":return"fas fa-check-circle";case"error":return"fas fa-times-circle";case"warning":return"fas fa-exclamation-circle";case"info":return"fas fa-info-circle";default:return"fas fa-bell"}}},methods:{show(e){this.timer&&clearTimeout(this.timer),this.message=e.message||"",this.type=e.type||"success",this.customColor=e.color||"",this.duration=void 0!==e.duration?e.duration:3e3,this.position=e.position||"top",this.showIcon=void 0===e.showIcon||e.showIcon,this.showClose=void 0!==e.showClose&&e.showClose,this.visible=!0,this.duration>0&&(this.timer=setTimeout((()=>{this.close()}),this.duration))},close(){this.visible=!1,this.timer&&(clearTimeout(this.timer),this.timer=null),this.onClose&&this.onClose()}}},l=s(1241);const d=(0,l.A)(c,[["render",r],["__scopeId","data-v-18bdfd8a"]]);var u=d;const h=[];let p=1;const g=function(e){"string"===typeof e&&(e={message:e}),e=e||{};const t="bar_message_"+p++,s=document.createElement("div"),o=e.onClose;e.onClose=()=>{m(t,o)};const i=(0,a.bF)(u,e);(0,n.XX)(i,s),document.body.appendChild(s);const r=i.component.proxy;r.show(e);const c={id:t,vnode:i,vm:r,container:s};return h.push(c),{close:()=>{r.close()}}};function m(e,t){const s=h.findIndex((t=>t.id===e));if(-1===s)return;const{vm:a,container:o}=h[s];a&&("function"===typeof t&&t(),(0,n.XX)(null,o),document.body.removeChild(o),h.splice(s,1))}["success","error","warning","info"].forEach((e=>{g[e]=t=>("string"===typeof t?t={message:t,type:e}:(t=t||{},t.type=e),g(t))})),g.permanent=e=>("string"===typeof e&&(e={message:e}),e=e||{},e.duration=0,e.showClose=!1!==e.showClose,g(e)),g.closeAll=function(){for(let e=h.length-1;e>=0;e--)h[e].vm.close()};var f=g},4529:function(e,t,s){var a=s(5130),n=s(6768);const o={id:"app"},i={class:"beian-footer"},r={class:"container"},c={class:"copyright"};function l(e,t){const s=(0,n.g2)("router-view"),a=(0,n.g2)("router-link");return(0,n.uX)(),(0,n.CE)("div",o,[(0,n.bF)(s),(0,n.Lk)("footer",i,[(0,n.Lk)("div",r,[t[2]||(t[2]=(0,n.Lk)("span",{style:{"white-space":"nowrap"}},[(0,n.Lk)("img",{src:"https://beian.mps.gov.cn/web/assets/logo01.6189a29f.png",alt:"公安标识",style:{"vertical-align":"middle",height:"16px",display:"inline-block"}}),(0,n.Lk)("a",{href:"https://beian.mps.gov.cn/",target:"_blank"}," 赣公网安备36090202000259号"),(0,n.eW)("  |  "),(0,n.Lk)("a",{href:"https://beian.miit.gov.cn/",target:"_blank"},"赣ICP备2024039267号-1")],-1)),(0,n.Lk)("div",c,[t[1]||(t[1]=(0,n.eW)(" © 2025 ")),(0,n.bF)(a,{to:"/about"},{default:(0,n.k6)((()=>t[0]||(t[0]=[(0,n.eW)("NEU小站")]))),_:1})])])])])}var d=s(1241);const u={},h=(0,d.A)(u,[["render",l]]);var p=h,g=s(1387);const m={class:"home"},f={class:"container"},v={class:"welcome-section"},b={class:"quick-links"};function k(e,t,s,a,o,i){const r=(0,n.g2)("Navbar");return(0,n.uX)(),(0,n.CE)("div",m,[(0,n.bF)(r),(0,n.Lk)("div",f,[(0,n.Lk)("div",v,[t[2]||(t[2]=(0,n.Lk)("img",{alt:"Vue logo",src:"https://download.东北大学.com/images/logo-hd.png"},null,-1)),t[3]||(t[3]=(0,n.Lk)("h1",null,"欢迎访问NEU小站",-1)),(0,n.Lk)("div",b,[t[1]||(t[1]=(0,n.Lk)("span",null,"快速入口:",-1)),(0,n.Lk)("a",{onClick:t[0]||(t[0]=e=>i.goTo("course",!0)),target:"_blank"},"课程评分系统")]),t[4]||(t[4]=(0,n.Lk)("div",{class:"intro-text"},[(0,n.Lk)("p",null,"“哈哈,恭喜你发现了宝藏,让我在接下来的日子里陪你一起成长吧”"),(0,n.Lk)("p",{style:{"text-align":"right"}},"——NEU小站")],-1))])])])}var y=s(6674),C=s(4993),w={name:"HomeView",components:{Navbar:y.A},created(){document.title="NEU小站"},methods:{goTo(e,t=!1){const s={course:"https://course.xn--xhq44jb2fzpc.com",oj:"https://oj.xn--xhq44jb2fzpc.com"},a=s[e];if(a)if(t){const e=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<768;e?C.A.confirm("推荐在电脑端访问,以获得最佳体验。仍要继续吗?","提示").then((()=>{window.open(a,"_blank")})).catch((()=>{})):window.open(a,"_blank")}else window.open(a,"_blank");else console.error(`No URL found for name: ${e}`)}}};const L=(0,d.A)(w,[["render",k],["__scopeId","data-v-5a2476b6"]]);var E=L,_=s(4130),A=s.n(_);A().configure({showSpinner:!1});const M=[{path:"/",name:"home",component:E},{path:"/login",name:"login",component:()=>s.e(612).then(s.bind(s,6612))},{path:"/article/:id",name:"article-detail",component:()=>s.e(665).then(s.bind(s,665))},{path:"/about",name:"about",component:()=>s.e(851).then(s.bind(s,8851))},{path:"/strategy",name:"strategy",component:()=>s.e(181).then(s.bind(s,8181))},{path:"/resources",name:"resources",component:()=>s.e(690).then(s.bind(s,9690))},{path:"/:pathMatch(.*)*",name:"404",component:()=>s.e(899).then(s.bind(s,3899))},{path:"/search",name:"search",component:()=>s.e(368).then(s.bind(s,7368))},{path:"/user-center",name:"user-center",component:()=>s.e(612).then(s.bind(s,6612))},{path:"/app",name:"app",component:()=>s.e(270).then(s.bind(s,9270))},{path:"/submit",name:"submit",component:()=>s.e(312).then(s.bind(s,312))},{path:"/preview",name:"preview",component:()=>s.e(665).then(s.bind(s,665))},{path:"/edit",name:"edit-article",component:()=>s.e(312).then(s.bind(s,312))},{path:"/widgets",name:"widgets",component:()=>s.e(155).then(s.bind(s,5155))},{path:"/widgets/webvpn",name:"webvpn",component:()=>s.e(898).then(s.bind(s,898))}],x=(0,g.aE)({history:(0,g.LA)("/"),routes:M});x.beforeEach(((e,t,s)=>{A().start(),s()})),x.afterEach((()=>{A().done()}));var I=x,S=s(2090);const X=(0,a.Ef)(p);X.config.globalProperties.$barMessage=S.A,X.use(I).mount("#app"),window.$barMessage=S.A},4993:function(e,t,s){s.d(t,{A:function(){return b}});var a=s(5130),n=s(6768),o=s(4232);const i={class:"message-box"},r={key:0,class:"message-header"},c={class:"message-content"},l={key:0,class:"input-wrapper"},d=["type","placeholder"],u={class:"message-footer"};function h(e,t,s,h,p,g){return(0,n.uX)(),(0,n.Wv)(a.eB,{name:"message-fade"},{default:(0,n.k6)((()=>[s.visible?((0,n.uX)(),(0,n.CE)("div",{key:0,class:"message-overlay",onClick:t[4]||(t[4]=(0,a.D$)(((...e)=>g.handleOverlayClick&&g.handleOverlayClick(...e)),["self"]))},[(0,n.Lk)("div",i,[s.title?((0,n.uX)(),(0,n.CE)("div",r,[(0,n.Lk)("h3",null,(0,o.v_)(s.title),1)])):(0,n.Q3)("",!0),(0,n.Lk)("div",c,[(0,n.Lk)("p",null,(0,o.v_)(s.message),1),s.showInput?((0,n.uX)(),(0,n.CE)("div",l,[(0,n.bo)((0,n.Lk)("input",{"onUpdate:modelValue":t[0]||(t[0]=e=>p.localInputValue=e),type:s.inputType,placeholder:s.inputPlaceholder,class:"message-input",onKeyup:t[1]||(t[1]=(0,a.jR)(((...e)=>g.handleConfirm&&g.handleConfirm(...e)),["enter"]))},null,40,d),[[a.hp,p.localInputValue]])])):(0,n.Q3)("",!0)]),(0,n.Lk)("div",u,[g.cancelVisible?((0,n.uX)(),(0,n.CE)("button",{key:0,class:"btn btn-cancel",onClick:t[2]||(t[2]=(...e)=>g.handleCancel&&g.handleCancel(...e))},(0,o.v_)(s.cancelText),1)):(0,n.Q3)("",!0),g.confirmVisible?((0,n.uX)(),(0,n.CE)("button",{key:1,class:"btn btn-confirm",onClick:t[3]||(t[3]=(...e)=>g.handleConfirm&&g.handleConfirm(...e))},(0,o.v_)(s.confirmText),1)):(0,n.Q3)("",!0)])])])):(0,n.Q3)("",!0)])),_:1})}var p={name:"MessageBox",props:{visible:{type:Boolean,default:!1},title:{type:String,default:""},message:{type:String,required:!0},confirm:{type:Boolean,default:!0},cancel:{type:Boolean,default:!1},confirmText:{type:String,default:"确定"},cancelText:{type:String,default:"取消"},closeOnClickOverlay:{type:Boolean,default:!1},showInput:{type:Boolean,default:!1},inputType:{type:String,default:"text"},inputValue:{type:String,default:""},inputPlaceholder:{type:String,default:"请输入"}},data(){return{localInputValue:""}},watch:{inputValue:{immediate:!0,handler(e){this.localInputValue=e}}},computed:{confirmVisible(){return this.confirm},cancelVisible(){return this.cancel}},methods:{handleConfirm(){this.$emit("confirm",this.localInputValue)},handleCancel(){this.$emit("cancel")},handleOverlayClick(){this.closeOnClickOverlay&&this.$emit("cancel")}}},g=s(1241);const m=(0,g.A)(p,[["render",h],["__scopeId","data-v-076938bc"]]);var f=m;const v=(e={})=>new Promise(((t,s)=>{const n=document.createElement("div");document.body.appendChild(n);const o=(0,a.Ef)(f,{...e,visible:!0,confirm:!1!==e.confirm,cancel:!0===e.cancel,onConfirm:e=>{o.unmount(),document.body.removeChild(n),t({value:e,action:"confirm"})},onCancel:()=>{o.unmount(),document.body.removeChild(n),s({action:"cancel"})}});o.mount(n)}));v.alert=(e,t="",s={})=>v({title:t,message:e,confirm:!0,cancel:!1,...s}),v.confirm=(e,t="",s={})=>v({title:t,message:e,confirm:!0,cancel:!0,...s}),v.prompt=(e,t="",s={})=>v({title:t,message:e,showInput:!0,confirm:!0,cancel:!0,...s});var b=v},6674:function(e,t,s){s.d(t,{A:function(){return me}});var a=s(6768),n=s(4232),o=s(5130);const i={class:"navbar"},r={class:"container"},c={class:"navbar-brand"},l={class:"burger-container"},d={key:0,class:"unread-dot burger-badge"},u={class:"navbar-end"},h={key:0,class:"navbar-item user-dropdown",style:{padding:"0"}},p={class:"avatar-wrapper"},g=["src","alt"],m={key:0,class:"unread-dot avatar-badge"},f={class:"user-nickname"},v={class:"dropdown-menu"},b={key:0,class:"unread-dot"},k={key:1,class:"navbar-item"},y={key:0,class:"activation-dialog"},C={class:"activation-dialog-content"},w={class:"activation-methods"},L={class:"activation-method"},E={class:"activation-method"},_={class:"activation-method"},A=["disabled"],M={key:1,class:"message-modal"},x={class:"message-modal-content"},I={class:"message-modal-header"},S={class:"message-modal-body",ref:"messageContainer"},X={key:0,class:"no-messages"},P={key:1,class:"message-list"},j={class:"message-header"},T={class:"message-time"},z={key:0,class:"unread-tag"},W=["innerHTML"],O={key:1,class:"message-content"},U=["href"],q={key:1},N={key:2,class:"message-content"},D=["href"],F={key:1},V={key:3,class:"message-content"},$=["href"],B={key:1},Q={key:4,class:"message-content"},R={key:5,class:"message-content"},J=["href"],Z={key:1},G={key:6,class:"message-content"},H=["href"],K={key:1},Y={key:7,class:"message-content"},ee=["href"],te={key:1},se={key:8,class:"message-content"},ae={key:2,class:"pagination"},ne=["disabled"],oe={class:"page-info"},ie=["disabled"];function re(e,t,s,re,ce,le){const de=(0,a.g2)("router-link");return(0,a.uX)(),(0,a.CE)("nav",i,[(0,a.Lk)("div",r,[(0,a.Lk)("div",c,[(0,a.bF)(de,{to:"/",class:"navbar-logo"},{default:(0,a.k6)((()=>[t[14]||(t[14]=(0,a.Lk)("img",{src:"https://download.xn--xhq44jb2fzpc.com/images/logo-hd.png",alt:"NEU小站",class:"navbar-logo-img"},null,-1)),t[15]||(t[15]=(0,a.Lk)("span",null,"NEU小站",-1)),le.currentTagConfig?((0,a.uX)(),(0,a.CE)("span",{key:0,style:(0,n.Tr)({backgroundColor:le.currentTagConfig.backgroundColor}),class:"route-tag"},(0,n.v_)(le.currentTagConfig.text),5)):(0,a.Q3)("",!0)])),_:1}),(0,a.Lk)("div",l,[(0,a.Lk)("div",{class:(0,n.C4)(["navbar-burger",{"is-active":ce.isMenuActive}]),onClick:t[0]||(t[0]=(...e)=>le.toggleMenu&&le.toggleMenu(...e))},t[16]||(t[16]=[(0,a.Lk)("span",null,null,-1),(0,a.Lk)("span",null,null,-1),(0,a.Lk)("span",null,null,-1)]),2),ce.userInfo&&ce.userInfo.messageUnread?((0,a.uX)(),(0,a.CE)("span",d)):(0,a.Q3)("",!0)])]),(0,a.Lk)("div",{class:(0,n.C4)(["navbar-menu",{"is-active":ce.isMenuActive}])},[(0,a.Lk)("div",u,[(0,a.bF)(de,{to:"/",class:"navbar-item"},{default:(0,a.k6)((()=>t[17]||(t[17]=[(0,a.eW)("首页")]))),_:1}),(0,a.bF)(de,{to:"/strategy",class:"navbar-item"},{default:(0,a.k6)((()=>t[18]||(t[18]=[(0,a.eW)("攻略指南")]))),_:1}),(0,a.bF)(de,{to:"/resources",class:"navbar-item"},{default:(0,a.k6)((()=>t[19]||(t[19]=[(0,a.eW)("资源共享")]))),_:1}),(0,a.bF)(de,{to:"/app",class:"navbar-item"},{default:(0,a.k6)((()=>t[20]||(t[20]=[(0,a.eW)("应用中心")]))),_:1}),(0,a.bF)(de,{to:"/widgets",class:"navbar-item"},{default:(0,a.k6)((()=>t[21]||(t[21]=[(0,a.eW)("小工具")]))),_:1}),(0,a.bF)(de,{to:"/about",class:"navbar-item"},{default:(0,a.k6)((()=>t[22]||(t[22]=[(0,a.eW)("关于")]))),_:1}),(0,a.bF)(de,{to:"/search",class:"navbar-item"},{default:(0,a.k6)((()=>t[23]||(t[23]=[(0,a.eW)("搜索")]))),_:1}),ce.userInfo?((0,a.uX)(),(0,a.CE)("div",h,[(0,a.Lk)("div",{class:"user-info",onClick:t[1]||(t[1]=(...e)=>le.toggleDropdown&&le.toggleDropdown(...e))},[(0,a.Lk)("div",p,[(0,a.Lk)("img",{src:ce.userInfo.avatar_path,class:"user-avatar",alt:ce.userInfo.nickname},null,8,g),ce.userInfo.messageUnread?((0,a.uX)(),(0,a.CE)("span",m)):(0,a.Q3)("",!0)]),(0,a.Lk)("span",f,(0,n.v_)(ce.userInfo.nickname),1),(0,a.Lk)("span",{class:(0,n.C4)(["dropdown-arrow",{"is-active":ce.isDropdownActive}])},"▼",2)]),(0,a.bo)((0,a.Lk)("div",v,[(0,a.Lk)("div",{class:"dropdown-item",onClick:t[2]||(t[2]=(...e)=>le.handleUserCenter&&le.handleUserCenter(...e))},"个人中心"),(0,a.Lk)("div",{class:"dropdown-item",onClick:t[3]||(t[3]=(...e)=>le.handleMessages&&le.handleMessages(...e))},[t[24]||(t[24]=(0,a.eW)(" 我的消息 ")),ce.userInfo.messageUnread?((0,a.uX)(),(0,a.CE)("span",b)):(0,a.Q3)("",!0)]),(0,a.Lk)("div",{class:"dropdown-item",onClick:t[4]||(t[4]=(...e)=>le.handleLogout&&le.handleLogout(...e))},"退出登录")],512),[[o.aG,ce.isDropdownActive]])])):((0,a.uX)(),(0,a.CE)("div",k,[(0,a.Lk)("a",{class:"login-btn",onClick:t[5]||(t[5]=(...e)=>le.handleLogin&&le.handleLogin(...e))},"登录")]))])],2)]),ce.showActivationDialog?((0,a.uX)(),(0,a.CE)("div",y,[(0,a.Lk)("div",C,[t[31]||(t[31]=(0,a.Lk)("h3",null,"账户激活",-1)),t[32]||(t[32]=(0,a.Lk)("p",null,"您的账户尚未激活,请选择以下一种方式进行激活。如果无法激活,请退出登录后在“关于”页面联系网站管理员。",-1)),(0,a.Lk)("div",w,[(0,a.Lk)("div",L,[t[25]||(t[25]=(0,a.Lk)("h4",null,"方式 1:NEU 校园网验证",-1)),t[26]||(t[26]=(0,a.Lk)("p",null,"请连接 NEU 校园网后点击下面的验证按钮(暂不支持秦皇岛分校)",-1)),(0,a.Lk)("button",{onClick:t[6]||(t[6]=(...e)=>le.handleNetworkVerify&&le.handleNetworkVerify(...e)),class:"verify-btn"},"校园网验证")]),(0,a.Lk)("div",E,[t[27]||(t[27]=(0,a.Lk)("h4",null,"方式 2:校园邮箱验证",-1)),t[28]||(t[28]=(0,a.Lk)("p",null,"使用 @stu.neu.edu.cn、@stu.neuq.edu.cn 或 @mails.neu.edu.cn 后缀的校园邮箱验证",-1)),(0,a.Lk)("button",{onClick:t[7]||(t[7]=(...e)=>le.handleEmailVerify&&le.handleEmailVerify(...e)),class:"verify-btn"},"邮箱验证")]),(0,a.Lk)("div",_,[t[29]||(t[29]=(0,a.Lk)("h4",null,"方式 3:学生证照片认证",-1)),t[30]||(t[30]=(0,a.Lk)("p",null,[(0,a.eW)("请上传清晰、无遮挡的学生证(校园卡,"),(0,a.Lk)("strong",null,"非火车票学生证"),(0,a.eW)(")个人信息面照片,并清晰露出公章(支持JPG/PNG/WEBP格式,不超过5M)")],-1)),(0,a.Lk)("input",{type:"file",onChange:t[8]||(t[8]=(...e)=>le.handleFileSelect&&le.handleFileSelect(...e)),accept:"image/jpeg,image/png,image/webp",ref:"fileInput",style:{display:"none"}},null,544),(0,a.Lk)("button",{onClick:t[9]||(t[9]=(...e)=>le.triggerFileInput&&le.triggerFileInput(...e)),class:"verify-btn",disabled:ce.isUploading},(0,n.v_)(ce.isUploading?"上传认证中...":"上传学生证"),9,A)])]),(0,a.Lk)("button",{onClick:t[10]||(t[10]=(...e)=>le.handleLogout&&le.handleLogout(...e)),class:"close-btn"},"退出登录")])])):(0,a.Q3)("",!0),ce.showMessageModal?((0,a.uX)(),(0,a.CE)("div",M,[(0,a.Lk)("div",x,[(0,a.Lk)("div",I,[t[33]||(t[33]=(0,a.Lk)("h3",null,"我的消息",-1)),(0,a.Lk)("span",{class:"close-icon",onClick:t[11]||(t[11]=(...e)=>le.closeMessageModal&&le.closeMessageModal(...e))},"×")]),(0,a.Lk)("div",S,[0===ce.messages.length?((0,a.uX)(),(0,a.CE)("div",X," 暂无消息 ")):((0,a.uX)(),(0,a.CE)("div",P,[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(ce.messages,(e=>((0,a.uX)(),(0,a.CE)("div",{key:e.id,class:"message-item"},[(0,a.Lk)("div",j,[(0,a.Lk)("span",T,(0,n.v_)(le.formatDate(e.created_at)),1),e.status?(0,a.Q3)("",!0):((0,a.uX)(),(0,a.CE)("span",z,"未读"))]),0===e.type?((0,a.uX)(),(0,a.CE)("div",{key:0,class:"message-content",innerHTML:e.content},null,8,W)):1===e.type?((0,a.uX)(),(0,a.CE)("div",O,[t[34]||(t[34]=(0,a.eW)(" 您在《")),e.article_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://www.xn--xhq44jb2fzpc.com/article/"+e.article_id,target:"_blank"},(0,n.v_)(e.article_title),9,U)):((0,a.uX)(),(0,a.CE)("span",q,(0,n.v_)(e.article_title),1)),(0,a.eW)("》内容下的「"+(0,n.v_)(e.original_content)+"」评论被回复:「"+(0,n.v_)(e.reply_content)+"」 ",1)])):2===e.type?((0,a.uX)(),(0,a.CE)("div",N,[t[35]||(t[35]=(0,a.eW)(" 您的投稿《")),e.article_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://www.xn--xhq44jb2fzpc.com/article/"+e.article_id,target:"_blank"},(0,n.v_)(e.title),9,D)):((0,a.uX)(),(0,a.CE)("span",F,(0,n.v_)(e.title),1)),(0,a.eW)("》审核"+(0,n.v_)(e.pass?"已通过":"未通过")+(0,n.v_)(e.note?",审核备注:"+e.note:""),1)])):3===e.type?((0,a.uX)(),(0,a.CE)("div",V,[t[36]||(t[36]=(0,a.eW)(' 您添加的课程"')),e.course_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://course.xn--xhq44jb2fzpc.com/courses?c="+le.encodeBase64(e.course_id),target:"_blank"},(0,n.v_)(e.course_name),9,$)):((0,a.uX)(),(0,a.CE)("span",B,(0,n.v_)(e.course_name),1)),(0,a.eW)('"审核'+(0,n.v_)(e.course_status),1)])):4===e.type?((0,a.uX)(),(0,a.CE)("div",Q," 您的密钥「"+(0,n.v_)(e.key_plaintext)+"」使用次数已用尽,继续投稿可获得新的密钥。 ",1)):5===e.type?((0,a.uX)(),(0,a.CE)("div",R,[t[37]||(t[37]=(0,a.eW)(" 您在《")),e.article_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://www.xn--xhq44jb2fzpc.com/article/"+e.article_id,target:"_blank"},(0,n.v_)(e.article_title),9,J)):((0,a.uX)(),(0,a.CE)("span",Z,(0,n.v_)(e.article_title),1)),(0,a.eW)("》内容下的「"+(0,n.v_)(e.content)+"」评论被点赞。 ",1)])):6===e.type?((0,a.uX)(),(0,a.CE)("div",G,[t[38]||(t[38]=(0,a.eW)(" 您的内容《")),e.article_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://www.xn--xhq44jb2fzpc.com/article/"+e.article_id,target:"_blank"},(0,n.v_)(e.article_title),9,H)):((0,a.uX)(),(0,a.CE)("span",K,(0,n.v_)(e.article_title),1)),(0,a.eW)("》收到新评论:「"+(0,n.v_)(e.comment_content)+"」 ",1)])):7===e.type?((0,a.uX)(),(0,a.CE)("div",Y,[t[39]||(t[39]=(0,a.eW)(" 恭喜您的内容《")),e.article_id?((0,a.uX)(),(0,a.CE)("a",{key:0,href:"https://www.xn--xhq44jb2fzpc.com/article/"+e.article_id,target:"_blank"},(0,n.v_)(e.article_title),9,ee)):((0,a.uX)(),(0,a.CE)("span",te,(0,n.v_)(e.article_title),1)),(0,a.eW)("》浏览量达到"+(0,n.v_)(e.view_count)+",感谢您为NEU小站贡献优质内容,小站因为有你而更加精彩~ ",1)])):((0,a.uX)(),(0,a.CE)("div",se,(0,n.v_)(e.error||"未知消息类型"),1))])))),128))])),ce.totalPages>1?((0,a.uX)(),(0,a.CE)("div",ae,[(0,a.Lk)("button",{disabled:1===ce.currentPage,onClick:t[12]||(t[12]=e=>le.loadMessages(ce.currentPage-1)),class:"page-btn"},"上一页",8,ne),(0,a.Lk)("span",oe,(0,n.v_)(ce.currentPage)+" / "+(0,n.v_)(ce.totalPages),1),(0,a.Lk)("button",{disabled:ce.currentPage===ce.totalPages,onClick:t[13]||(t[13]=e=>le.loadMessages(ce.currentPage+1)),class:"page-btn"},"下一页",8,ie)])):(0,a.Q3)("",!0)],512)])])):(0,a.Q3)("",!0)])}s(4114),s(8111),s(116),s(3579),s(4979);var ce=s(8704),le=s(4373),de=s(4993),ue=s(9090),he={name:"NavBar",data(){return{isMenuActive:!1,isDropdownActive:!1,userInfo:null,showActivationDialog:!1,isActivated:!1,isUploading:!1,showMessageModal:!1,messages:[],loading:!1,currentPage:1,totalPages:1,pageSize:10,tagConfigurations:[{text:"应用",backgroundColor:"#ff8c00",routes:["/app","/app/"],wildcard:!1},{text:"工具",backgroundColor:"#3273dc",routes:["/widgets"],wildcard:!0}]}},computed:{currentTagConfig(){const e=this.$route.path;return this.tagConfigurations.find((t=>!!t.routes.includes(e)||!!t.wildcard&&t.routes.some((t=>e===t||e.startsWith(t+"/")))))||null}},mounted(){this.checkLoginStatus()},methods:{handleLogin(){(0,ue.A)().then((e=>{console.log(e),this.checkLoginStatus()})).catch((e=>{console.log(e)}))},toggleMenu(){this.isMenuActive=!this.isMenuActive},toggleDropdown(){this.isDropdownActive=!this.isDropdownActive},handleUserCenter(){this.isDropdownActive=!1,this.$router.push("/user-center")},handleLogout(){const e=window.location.hostname.includes("localhost")?"localhost":window.location.hostname.split(".").slice(-2).join(".");ce.A.remove("token",{domain:e,path:"/"}),this.userInfo=null,window.location.reload()},checkLoginStatus(){const e=ce.A.get("token");e&&le.A.get("https://newfront.xn--xhq44jb2fzpc.com/user/info",{headers:{Authorization:e}}).then((e=>{this.userInfo=e.data,e.data.banned?(this.$barMessage({message:"您的账户已被封禁,请联系网站管理员",type:"error"}),de.A.alert('您的账户已被封禁,如有疑问请在"关于"页面联系网站管理员。',"账户状态异常",{confirmText:"退出登录",cancel:!1}).then((()=>{this.handleLogout()})).catch((()=>{this.handleLogout()}))):(this.isActivated=e.data.activated,this.isActivated||(this.showActivationDialog=!0))})).catch((e=>{console.log(e),this.userInfo=null}))},closeActivationDialog(){this.showActivationDialog=!1},handleNetworkVerify(){const e=ce.A.get("token");e?le.A.get("https://userlogin.xn--xhq44jb2fzpc.com/qv",{headers:{Authorization:e}}).then((e=>{de.A.alert(e.data.message,"提示"),this.isActivated=!0,this.showActivationDialog=!1})).catch((e=>{e.response&&e.response.data?de.A.alert(`${e.response.data.message} 当前IP: ${e.response.data.ip||"未知"}`,"提示"):de.A.alert("验证失败,请稍后重试","提示")})):de.A.alert("您未登录,请先登录后操作!","提示")},handleEmailVerify(){const e=ce.A.get("token");e?le.A.get("https://userlogin.xn--xhq44jb2fzpc.com/check-email",{headers:{Authorization:e}}).then((e=>{de.A.alert(e.data.message,"提示"),this.isActivated=!0,this.showActivationDialog=!1})).catch((t=>{t.response&&403===t.response.status?this.promptForCampusEmail(e):t.response&&t.response.data?de.A.alert(t.response.data.message||"发生未知错误,请稍后重试","提示"):de.A.alert("验证失败,请稍后重试","提示")})):de.A.alert("您未登录,请先登录后操作!","提示")},promptForCampusEmail(e){(0,de.A)({title:"校园邮箱验证",message:"请输入您的校园邮箱:",showInput:!0,inputPlaceholder:"请输入校园邮箱",confirmText:"确认",cancelText:"取消",cancel:!0}).then((({value:t})=>{t?t.endsWith("@stu.neu.edu.cn")||t.endsWith("@stu.neuq.edu.cn")||t.endsWith("@mails.neu.edu.cn")?this.sendCampusVerificationEmail(t,e):de.A.alert("请输入有效的 @stu.neu.edu.cn、@stu.neuq.edu.cn 或 @mails.neu.edu.cn 校园邮箱!","提示"):de.A.alert("邮箱不能为空","提示")})).catch((()=>{}))},sendCampusVerificationEmail(e,t){le.A.post("https://userlogin.xn--xhq44jb2fzpc.com/send-campus-verify",{campus_email:e},{headers:{Authorization:t,"Content-Type":"application/json"}}).then((t=>{de.A.alert(`验证邮件已发送至 ${e},请检查您的邮箱完成验证。`,"提示")})).catch((e=>{e.response&&e.response.data?de.A.alert(`发送验证邮件失败:${e.response.data.message}`,"提示"):de.A.alert("发送验证邮件失败,请稍后重试","提示")}))},handleMessages(){this.isDropdownActive=!1,this.showMessageModal=!0,this.loadMessages(1)},closeMessageModal(){this.showMessageModal=!1,this.checkLoginStatus()},loadMessages(e){this.currentPage=e,le.A.get("https://newfront.xn--xhq44jb2fzpc.com/message/get",{headers:{Authorization:ce.A.get("token")},params:{page:e}}).then((e=>{this.messages=e.data.messages,this.totalPages=e.data.totalPages,this.pageSize=e.data.pageSize})).catch((e=>{console.error("获取消息失败:",e),de.A.alert("获取消息失败,请稍后再试。","错误")}))},formatDate(e){const t=new Date(e);return t.toLocaleDateString()+" "+t.toLocaleTimeString()},encodeBase64(e){return window.btoa(e)},triggerFileInput(){this.$refs.fileInput.click()},async handleFileSelect(e){const t=e.target.files[0];if(!t)return;const s=["image/jpeg","image/png","image/webp"];if(!s.includes(t.type))return void de.A.alert("不支持的文件格式,请上传 JPG, PNG, 或 WEBP 图片。","格式错误");const a=5242880;if(t.size>a)de.A.alert("文件大小不能超过 5MB。","文件过大");else{this.isUploading=!0;try{const e=ce.A.get("token");if(!e)return de.A.alert("您未登录,请先登录后操作!","提示"),void(this.isUploading=!1);const s=await le.A.post("https://newfront.xn--xhq44jb2fzpc.com/freshman/validate_card/get-upload-url",{filename:t.name},{headers:{Authorization:e}}),{uploadUrl:a,objectPath:n}=s.data;await le.A.put(a,t,{headers:{"Content-Type":t.type}});await le.A.post("https://newfront.xn--xhq44jb2fzpc.com/freshman/validate_card/verify",{objectPath:n},{headers:{Authorization:e}});de.A.alert("学生证认证成功!","激活成功"),this.isActivated=!0,this.showActivationDialog=!1,this.checkLoginStatus()}catch(n){let e="操作失败,请稍后重试。";n.response&&n.response.data&&n.response.data.message&&(e=n.response.data.message),de.A.alert(e,"错误")}finally{this.isUploading=!1,this.$refs.fileInput.value=""}}}}},pe=s(1241);const ge=(0,pe.A)(he,[["render",re],["__scopeId","data-v-19edf2fa"]]);var me=ge},9090:function(e,t,s){s.d(t,{A:function(){return A}});var a=s(5130),n=s(6768),o=s(4232);const i={key:0,class:"login-container"},r={class:"login-box"},c={class:"login-header"},l={class:"form-group"},d={class:"form-group"},u={class:"button-group"},h={class:"modal-content"},p={class:"modal-header"},g={class:"modal-body"},m={class:"captcha-instruction"},f={class:"form-group"},v={class:"modal-footer"},b={key:0,class:"loading-overlay"};function k(e,t,s,k,y,C){return s.visible?((0,n.uX)(),(0,n.CE)("div",i,[t[13]||(t[13]=(0,n.Lk)("div",{class:"login-overlay"},null,-1)),(0,n.Lk)("div",r,[(0,n.Lk)("div",c,[t[8]||(t[8]=(0,n.Lk)("h2",{class:"login-title"},"登录/注册",-1)),s.showClose?((0,n.uX)(),(0,n.CE)("button",{key:0,onClick:t[0]||(t[0]=(...e)=>C.handleClose&&C.handleClose(...e)),class:"close-btn"},"×")):(0,n.Q3)("",!0)]),(0,n.Lk)("form",{onSubmit:t[4]||(t[4]=(0,a.D$)(((...e)=>C.handleSubmit&&C.handleSubmit(...e)),["prevent"])),class:"login-form"},[(0,n.Lk)("div",l,[t[9]||(t[9]=(0,n.Lk)("label",{for:"email"},"邮箱",-1)),(0,n.bo)((0,n.Lk)("input",{type:"email",id:"email","onUpdate:modelValue":t[1]||(t[1]=e=>y.email=e),placeholder:"请输入邮箱地址",required:"",class:"form-input",pattern:"[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$",title:"请输入有效的邮箱地址"},null,512),[[a.Jo,y.email]])]),(0,n.Lk)("div",d,[t[10]||(t[10]=(0,n.Lk)("label",{for:"password"},"密码",-1)),(0,n.bo)((0,n.Lk)("input",{type:"password",id:"password","onUpdate:modelValue":t[2]||(t[2]=e=>y.password=e),placeholder:"请输入密码",required:"",class:"form-input"},null,512),[[a.Jo,y.password]])]),y.message?((0,n.uX)(),(0,n.CE)("div",{key:0,class:(0,o.C4)(["message",{error:y.messageIsError,success:!y.messageIsError}])},(0,o.v_)(y.message),3)):(0,n.Q3)("",!0),(0,n.Lk)("div",u,[(0,n.Lk)("button",{type:"button",onClick:t[3]||(t[3]=(...e)=>C.login&&C.login(...e)),class:"btn btn-primary"},"登录/注册")])],32)]),(0,n.Lk)("div",{class:(0,o.C4)(["modal",{show:y.showCaptchaModal}])},[(0,n.Lk)("div",h,[(0,n.Lk)("div",p,[t[11]||(t[11]=(0,n.Lk)("h3",null,"邮箱验证",-1)),(0,n.Lk)("button",{onClick:t[5]||(t[5]=(...e)=>C.closeCaptchaModal&&C.closeCaptchaModal(...e)),class:"close-btn"},"×")]),(0,n.Lk)("div",g,[(0,n.Lk)("p",m,(0,o.v_)(y.captchaInstruction),1),(0,n.Lk)("div",f,[(0,n.bo)((0,n.Lk)("input",{type:"text","onUpdate:modelValue":t[6]||(t[6]=e=>y.captchaCode=e),placeholder:"请输入验证码",class:"form-input"},null,512),[[a.Jo,y.captchaCode]])]),y.captchaMessage?((0,n.uX)(),(0,n.CE)("div",{key:0,class:(0,o.C4)(["captcha-message",{error:y.captchaMessageIsError,success:!y.captchaMessageIsError}])},(0,o.v_)(y.captchaMessage),3)):(0,n.Q3)("",!0)]),(0,n.Lk)("div",v,[(0,n.Lk)("button",{onClick:t[7]||(t[7]=(...e)=>C.verifyCaptcha&&C.verifyCaptcha(...e)),class:"btn btn-primary"},"验证")])])],2),y.loading?((0,n.uX)(),(0,n.CE)("div",b,[t[12]||(t[12]=(0,n.Lk)("div",{class:"spinner"},null,-1)),(0,n.Lk)("p",null,(0,o.v_)(y.loadingMessage),1)])):(0,n.Q3)("",!0)])):(0,n.Q3)("",!0)}var y=s(4993),C={name:"Login",props:{visible:{type:Boolean,default:!0},showClose:{type:Boolean,default:!1},onSuccess:{type:Function,default:null},onClose:{type:Function,default:null}},data(){return{email:"",password:"",message:"",messageIsError:!0,loading:!1,loadingMessage:"加载中...",showCaptchaModal:!1,captchaCode:"",captchaMessage:"",captchaMessageIsError:!0,captchaInstruction:"验证码已发送至您的邮箱,请在下方输入"}},methods:{detectDevice(){const e=navigator.userAgent;return/android/i.test(e)?"Android":/iPad|iPhone|iPod/.test(e)?"iOS":/Windows Phone/i.test(e)?"Windows Phone":/Windows/i.test(e)?"Windows":/Macintosh|Mac OS X/i.test(e)?"macOS":/Linux/i.test(e)?"Linux":"Unknown"},async handleSubmit(){await this.login()},handleClose(){this.onClose?this.onClose():this.$emit("close")},async login(){if(!this.email||!this.password)return this.message="请输入邮箱和密码",void(this.messageIsError=!0);const e=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;if(!e.test(this.email))return this.message="请输入有效的邮箱地址",void(this.messageIsError=!0);this.loading=!0,this.loadingMessage="登录中...";try{const e=await this.loginOrRegister(this.email,this.password,"login");"Login successful."===e.message?this.handleLoginSuccess(e):"User not registered."===e.message?(this.loading=!1,(0,y.A)({title:"邮箱未注册",message:'此邮箱没有注册。点击"发送"按钮将向您的邮箱发送注册验证码。',confirmText:"发送",cancelText:"取消",cancel:!0,closeOnClickOverlay:!0}).then((async()=>{await this.sendRegisterCode()})).catch((()=>{}))):"Invalid email or password."===e.message?(this.message="密码错误。",this.messageIsError=!0,this.loading=!1):(this.message=e.message||"登录失败,请重试。",this.messageIsError=!0,this.loading=!1)}catch(t){console.error("Error:",t),this.message="发生错误,请稍后重试。",this.messageIsError=!0,this.loading=!1}},async register(){if(!this.email||!this.password)return this.message="请输入邮箱和密码",void(this.messageIsError=!0);const e=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;if(!e.test(this.email))return this.message="请输入有效的邮箱地址",void(this.messageIsError=!0);await this.sendRegisterCode()},async sendRegisterCode(){this.loading=!0,this.loadingMessage="发送验证码中...";try{const e=await this.loginOrRegister(this.email,this.password,"register");"Verification email sent."===e.message?(this.captchaInstruction="验证码已发送至您的邮箱,请在下方输入",this.captchaMessage="",this.captchaCode="",this.showCaptchaModal=!0):"A valid code has already been sent. Please try again later."===e.message?(this.captchaInstruction="您还有未验证的验证码,请查看邮箱并在下方输入",this.captchaMessage="",this.captchaCode="",this.showCaptchaModal=!0):"Email is already registered."===e.message?(this.message="此邮箱已注册。",this.messageIsError=!0):(this.message="发送验证码失败,请稍后重试。",this.messageIsError=!0),this.loading=!1}catch(e){console.error("Error:",e),this.message="发生错误,请稍后重试。",this.messageIsError=!0,this.loading=!1}},async verifyCaptcha(){if(!this.captchaCode)return this.captchaMessage="请输入验证码",void(this.captchaMessageIsError=!0);try{const e=await this.verifyRegisterCode(this.email,this.captchaCode);"User registered successfully."===e.message?(this.captchaMessage="验证成功!",this.captchaMessageIsError=!1,setTimeout((()=>{this.closeCaptchaModal(),this.handleSuccessfulRegistration()}),1500)):(this.captchaMessage="您的验证码不正确",this.captchaMessageIsError=!0)}catch(e){console.error("Error:",e),this.captchaMessage="验证过程中发生错误,请重试",this.captchaMessageIsError=!0}},closeCaptchaModal(){this.showCaptchaModal=!1,this.captchaCode="",this.captchaMessage=""},async handleSuccessfulRegistration(){this.message="注册成功!正在登录...",this.messageIsError=!1,this.loading=!0,this.loadingMessage="登录中...",await this.delay(1e3);try{const e=await this.loginOrRegister(this.email,this.password,"login");"Login successful."===e.message?this.handleLoginSuccess(e):(this.message="注册成功,但自动登录失败,请手动登录。",this.messageIsError=!0,this.loading=!1)}catch(e){console.error("Error during login after registration:",e),this.message="注册成功,但自动登录失败,请手动登录。",this.messageIsError=!0,this.loading=!1}},handleLoginSuccess(e){const t=e.token,s=window.location.hostname.includes("localhost")?"localhost":window.location.hostname.split(".").slice(-2).join(".");document.cookie=`token=${t}; max-age=86340; path=/; domain=${s}; secure; SameSite=Strict`,this.loading=!1,this.message="登录成功!正在加载中...",this.messageIsError=!1;const a={email:this.email,userId:e.id,token:e.token};this.onSuccess&&(this.onSuccess(a),window.location.reload()),this.$emit("login-success",a),this.onClose&&setTimeout((()=>{this.handleClose()}),3e3)},async loginOrRegister(e,t,s){const a="login"===s?"https://userlogin.xn--xhq44jb2fzpc.com/login":"https://userlogin.xn--xhq44jb2fzpc.com/register",n={email:e,password:t};"login"===s&&(n.device=this.detectDevice());const o=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return o.json()},async verifyRegisterCode(e,t){const s="https://userlogin.xn--xhq44jb2fzpc.com/verify-register-code",a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,code:t})});return a.json()},delay(e){return new Promise((t=>setTimeout(t,e)))}}},w=s(1241);const L=(0,w.A)(C,[["render",k],["__scopeId","data-v-66365b1a"]]);var E=L;const _=(e={})=>new Promise(((t,s)=>{const n=document.createElement("div");document.body.appendChild(n);const o=(0,a.Ef)(E,{...e,visible:!0,showClose:!0,onSuccess:e=>{t(e)},onClose:()=>{o.unmount(),document.body.removeChild(n)}});o.mount(n)}));_.withCallback=(e,t={})=>_({...t,onSuccess:t=>{e(t)}});var A=_}},t={};function s(a){var n=t[a];if(void 0!==n)return n.exports;var o=t[a]={exports:{}};return e[a].call(o.exports,o,o.exports,s),o.exports}s.m=e,function(){var e=[];s.O=function(t,a,n,o){if(!a){var i=1/0;for(d=0;d=o)&&Object.keys(s.O).every((function(e){return s.O[e](a[c])}))?a.splice(c--,1):(r=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[a,n,o]}}(),function(){s.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return s.d(t,{a:t}),t}}(),function(){s.d=function(e,t){for(var a in t)s.o(t,a)&&!s.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})}}(),function(){s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce((function(t,a){return s.f[a](e,t),t}),[]))}}(),function(){s.u=function(e){return"js/"+e+"."+{12:"dc7bebdb",155:"e8f96718",181:"a07c9ba6",270:"3e1923a6",312:"451d9778",368:"6fa43fcb",612:"e292fb5a",665:"5c707a2c",690:"2a36b428",851:"d90b5d58",898:"24c8f049",899:"3cbdab3e",940:"705f02e8"}[e]+".js"}}(),function(){s.miniCssF=function(e){return"css/"+e+"."+{155:"e92d57c5",181:"8f61b0cf",270:"e032f250",312:"a2ba332f",368:"9ee9e7c3",612:"63433215",665:"677d9f0e",690:"4b505240",851:"2abe3c1e",898:"6cbcb5bc",899:"35501d47"}[e]+".css"}}(),function(){s.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="newfront:";s.l=function(a,n,o,i){if(e[a])e[a].push(n);else{var r,c;if(void 0!==o)for(var l=document.getElementsByTagName("script"),d=0;d

网站作者也是NEU在读学生,我希望NEU小站的存在能弥补一下校内资源共享的极度空缺,能够给大家的学习帮上忙~有BUG或功能建议,欢迎与我交流!同时感谢且欢迎各位同学投稿资源!

-

NEU小站承诺永久免费提供服务,网站设置"东币系统"是为了激励投稿,以及一定程度上减少无意义的下载,因为下行流量费很高...

+

NEU小站目前所有服务均为免费提供,网站设置"东币系统"是为了激励投稿,以及一定程度上减少无意义的下载,因为下行流量费很高...

网站主体技术栈包括:Vue、Vuex、Node.js(以Prisma ORM、Nest.js为主),如有同学愿意加入开发,欢迎联系我~