340 lines
9.7 KiB
HTML
340 lines
9.7 KiB
HTML
<style>
|
|
.store * {
|
|
margin: 0;
|
|
padding: 0;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.store {
|
|
--primary: #50C878;
|
|
--primary-light: #90EE90;
|
|
--primary-dark: #3A9156;
|
|
--danger: #E74C3C;
|
|
--bg: #F9FFFB;
|
|
--shadow: 0 12px 30px rgba(80, 200, 120, .12);
|
|
--radius: 8px;
|
|
padding: 26px 14px;
|
|
background: var(--bg);
|
|
}
|
|
|
|
.store .container {
|
|
width: 100%;
|
|
max-width: 420px;
|
|
margin: 0 auto;
|
|
padding: 32px 24px;
|
|
border-radius: var(--radius);
|
|
background: #fff;
|
|
box-shadow: var(--shadow);
|
|
position: relative;
|
|
}
|
|
|
|
.store .top-bar {
|
|
height: 4px;
|
|
width: 100%;
|
|
background: linear-gradient(90deg, #8ef5b4, #50C878, #3A9156);
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
}
|
|
|
|
.store .title {
|
|
text-align: center;
|
|
font-size: 26px;
|
|
font-weight: 800;
|
|
color: #2C3E50;
|
|
margin-bottom: 14px;
|
|
}
|
|
|
|
/* 搜索 */
|
|
.store .tag-container {
|
|
margin: 10px 0
|
|
}
|
|
|
|
.store .tag-search-wrapper {
|
|
position: relative;
|
|
margin-bottom: 6px
|
|
}
|
|
|
|
#tag-search {
|
|
width: 100%;
|
|
padding: 7px 12px 7px 34px;
|
|
border-radius: 8px;
|
|
border: 1px solid #c9efd6;
|
|
outline: none;
|
|
background: #fafffb;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.store .search-icon {
|
|
position: absolute;
|
|
top: 50%;
|
|
left: 10px;
|
|
transform: translateY(-50%);
|
|
}
|
|
|
|
/* 标签居中 */
|
|
.store .tag-list {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 8px;
|
|
padding: 8px;
|
|
border-radius: 8px;
|
|
border: 1px solid #c9efd6;
|
|
background: rgba(144, 238, 144, .08);
|
|
max-height: 100px;
|
|
overflow-y: auto;
|
|
justify-content: center;
|
|
}
|
|
|
|
.store .tag-item {
|
|
padding: 5px 7px;
|
|
border-radius: 8px;
|
|
border: 1px solid #90ee90;
|
|
font-size: 12px;
|
|
cursor: pointer;
|
|
background: #fff;
|
|
color: #2c6e49;
|
|
transition: .25s;
|
|
}
|
|
|
|
.store .tag-item:hover {
|
|
background: linear-gradient(135deg, #90ee90, #50c878);
|
|
color: #fff;
|
|
}
|
|
|
|
/* 无结果提示 */
|
|
.store .no-result {
|
|
width: 100%;
|
|
text-align: center;
|
|
align-items: center;
|
|
justify-content: center;
|
|
color: #7f8c8d;
|
|
font-size: 13px;
|
|
min-height: 100%;
|
|
padding: 0;
|
|
display: none;
|
|
}
|
|
|
|
/* 输入框 */
|
|
.store .input-group {
|
|
display: flex;
|
|
gap: 8px;
|
|
margin: 16px 0;
|
|
align-items: center;
|
|
}
|
|
|
|
.store .section-divider {
|
|
position: relative;
|
|
height: 18px;
|
|
margin: 6px 0 14px;
|
|
}
|
|
|
|
.store .section-divider::before {
|
|
content: "";
|
|
position: absolute;
|
|
top: 50%;
|
|
left: 0;
|
|
width: 100%;
|
|
height: 1px;
|
|
transform: translateY(-50%);
|
|
background: linear-gradient(90deg, rgba(80, 200, 120, 0), rgba(80, 200, 120, .55), rgba(80, 200, 120, 0));
|
|
box-shadow: 0 1px 0 rgba(80, 200, 120, .12);
|
|
}
|
|
|
|
.store .section-divider::after {
|
|
content: "";
|
|
position: absolute;
|
|
top: 50%;
|
|
left: 50%;
|
|
width: 10px;
|
|
height: 10px;
|
|
transform: translate(-50%, -50%) rotate(45deg);
|
|
border-radius: 2px;
|
|
background: linear-gradient(135deg, #90ee90, #50c878);
|
|
box-shadow: -14px 0 0 -3px rgba(80, 200, 120, .5), 14px 0 0 -3px rgba(80, 200, 120, .5), 0 0 0 2px #ffffff;
|
|
}
|
|
|
|
#file-path {
|
|
flex: 1;
|
|
padding: 8px 14px;
|
|
border-radius: 8px;
|
|
border: 2px solid #e8f7ec;
|
|
font-size: 14px;
|
|
outline: none;
|
|
}
|
|
|
|
#submit-btn {
|
|
padding: 10px 20px;
|
|
border-radius: 8px;
|
|
border: none;
|
|
background: linear-gradient(135deg, #50c878, #3a9156);
|
|
color: #fff;
|
|
font-size: 14px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
/* 手机端 */
|
|
@media(max-width:520px) {
|
|
.store {
|
|
padding: 14px
|
|
}
|
|
|
|
.store .container {
|
|
padding: 22px 18px;
|
|
max-width: 95%
|
|
}
|
|
|
|
.store .title {
|
|
font-size: 22px
|
|
}
|
|
|
|
.store .input-group {
|
|
flex-direction: column;
|
|
align-items: stretch;
|
|
}
|
|
|
|
#submit-btn {
|
|
width: 100%
|
|
}
|
|
|
|
.store .tag-list {
|
|
max-height: 120px
|
|
}
|
|
|
|
#file-path {
|
|
width: 100%;
|
|
box-sizing: border-box;
|
|
}
|
|
}
|
|
</style>
|
|
|
|
<div class="store">
|
|
<div class="container">
|
|
<div class="top-bar"></div>
|
|
|
|
<h1 class="title">储物柜</h1>
|
|
|
|
<div class="input-group">
|
|
<input id="file-path" placeholder="请输入翻找目标..." autocomplete="off">
|
|
<button id="submit-btn">翻 找</button>
|
|
</div>
|
|
|
|
<div class="section-divider" aria-hidden="true"></div>
|
|
|
|
<div class="tag-container">
|
|
<div class="tag-search-wrapper">
|
|
<span class="search-icon"><i class="ri-search-line"></i></span>
|
|
<input id="tag-search" placeholder="搜索标签..." autocomplete="off">
|
|
</div>
|
|
<div class="tag-list">
|
|
<div class="tag-item" data-value="/themes/theme-pix/assets/img/loading.webp">加载动画</div>
|
|
<div class="tag-item" data-value="/themes/theme-pix/assets/img/logo.webp">网站Logo</div>
|
|
<div class="tag-item" data-value="/themes/theme-pix/assets/img/banner-all.webp">全部横幅</div>
|
|
<div class="tag-item" data-value="/themes/theme-pix/assets/img/banner-dong.webp">冬季横幅</div>
|
|
<div class="tag-item" data-value="/themes/theme-pix/assets/img/cover-mei.webp">封面3</div>
|
|
<div class="tag-item" data-value="/themes/theme-pix/assets/img/banner-init.webp">初始横幅</div>
|
|
<div class="tag-item" data-value="/themes/theme-pix/assets/img/sidebar-notice.webp">侧边栏通知</div>
|
|
<div class="tag-item" data-value="/themes/theme-pix/assets/img/cover-song.webp">封面1</div>
|
|
<div class="tag-item" data-value="/themes/theme-pix/assets/img/sidebar-quote.webp">侧边栏引用</div>
|
|
<div class="tag-item" data-value="/themes/theme-pix/assets/img/cover-zhu.webp">封面2</div>
|
|
<div class="no-result" id="noResult">没有匹配的结果</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function initializeStoreEvents() {
|
|
let closeLoading = null;
|
|
const container = document.querySelector(".store");
|
|
if (!container || container.dataset.init === "1") return;
|
|
container.dataset.init = "1";
|
|
|
|
const input = document.getElementById('file-path');
|
|
const btn = document.getElementById('submit-btn');
|
|
const tagItems = document.querySelectorAll('.tag-item');
|
|
const tagSearch = document.getElementById('tag-search');
|
|
const noResult = document.getElementById('noResult');
|
|
|
|
tagItems.forEach(t => {
|
|
t.onclick = () => {
|
|
input.value = t.dataset.value;
|
|
cocoMessage.success('已填入对应标签信息');
|
|
};
|
|
});
|
|
|
|
tagSearch.oninput = () => {
|
|
const k = tagSearch.value.toLowerCase();
|
|
let visible = 0;
|
|
|
|
tagItems.forEach(t => {
|
|
const show = t.textContent.toLowerCase().includes(k) ||
|
|
t.dataset.value.toLowerCase().includes(k);
|
|
t.style.display = show ? 'inline-flex' : 'none';
|
|
if (show) visible++;
|
|
});
|
|
|
|
noResult.style.display = visible === 0 ? 'flex' : 'none';
|
|
};
|
|
|
|
function check(url) {
|
|
return new Promise(r => {
|
|
const xhr = new XMLHttpRequest();
|
|
try {
|
|
xhr.open('HEAD', url, true);
|
|
} catch (e) {
|
|
r(0);
|
|
return;
|
|
}
|
|
xhr.timeout = 5000;
|
|
xhr.onload = () => r(xhr.status);
|
|
xhr.onerror = () => r(0);
|
|
xhr.ontimeout = () => r(0);
|
|
xhr.send();
|
|
});
|
|
}
|
|
|
|
function normalizeDestination(value) {
|
|
const trimmed = value.trim();
|
|
if (!trimmed || /\\/.test(trimmed)) return null;
|
|
|
|
const url = trimmed.charAt(0) === '/' ? trimmed : '/' + trimmed;
|
|
if (/^\/\//.test(url)) return null;
|
|
|
|
return url;
|
|
}
|
|
|
|
async function go() {
|
|
const v = input.value.trim();
|
|
if (!v) return cocoMessage.warning('请输入翻找目标');
|
|
const url = normalizeDestination(v);
|
|
if (!url) return cocoMessage.warning('翻找目标无效');
|
|
btn.textContent = '翻找中...';
|
|
closeLoading = cocoMessage.loading('正在翻找中,请稍候...');
|
|
btn.disabled = true;
|
|
try {
|
|
const status = await check(url);
|
|
if (status === 200) {
|
|
cocoMessage.success('翻找成功,即将打开目标页面');
|
|
window.open(url, '_blank');
|
|
} else if (status === 404) {
|
|
cocoMessage.warning('翻找失败,失败过多将被封禁');
|
|
} else {
|
|
cocoMessage.error('翻找异常,请重试或刷新页面');
|
|
}
|
|
} finally {
|
|
closeLoading?.();
|
|
closeLoading = null;
|
|
btn.textContent = '翻 找';
|
|
btn.disabled = false;
|
|
}
|
|
}
|
|
|
|
btn.onclick = go;
|
|
input.onkeydown = e => { if (e.key === 'Enter') go(); };
|
|
}
|
|
|
|
initializeStoreEvents();
|
|
|
|
</script> |