175 lines
7.1 KiB
HTML
175 lines
7.1 KiB
HTML
<script src="/static/index/js/vue.global.min.js"></script>
|
|
<script src="/static/index/js/index.full.min.js"></script>
|
|
<script src="/static/index/js/axios.min.js"></script>
|
|
<script>
|
|
const { createApp, ref, onMounted, onUnmounted } = Vue;
|
|
const { ElButton, ElMessage } = ElementPlus;
|
|
const app = createApp({
|
|
setup() {
|
|
// 定义响应式数据
|
|
const elementOpacity = ref(0);
|
|
const scrollThreshold = ref(150); // 动态设置的滚动阈值
|
|
const keyword = ref('{$keyword??''}');
|
|
const qcodeVisible = ref(false);
|
|
const layerVisible = ref(false);
|
|
const content = ref('');
|
|
const load = ref(false)
|
|
const drawer = ref(false)
|
|
const rankList = ref([]);
|
|
const rankDj = ref([]);
|
|
const is_m = ref(0);
|
|
const newList = ref([]);
|
|
|
|
|
|
// 公共消息方法
|
|
const showMessage = (message, type = 'info') => {
|
|
ElMessage({
|
|
message,
|
|
type,
|
|
plain: true,
|
|
});
|
|
};
|
|
|
|
|
|
// 滚动监听方法
|
|
const handleScroll = () => {
|
|
const scrollTop = window.scrollY || document.documentElement.scrollTop;
|
|
elementOpacity.value = scrollTop >= scrollThreshold.value
|
|
? Math.min((scrollTop - scrollThreshold.value) / 100, 1)
|
|
: Math.max(1 - (scrollThreshold.value - scrollTop) / 100, 0);
|
|
|
|
const boxElement = document.querySelector('.listBox .screen .fixed .box');
|
|
if (boxElement.style.display === 'block' && is_m.value) {
|
|
boxElement.style.display = 'none'; // 隐藏元素
|
|
}
|
|
};
|
|
|
|
// 搜索按钮点击事件
|
|
const searchBtn = () => {
|
|
if (!keyword.value) {
|
|
return showMessage('请输入你要搜索的内容~', 'error');
|
|
}
|
|
const currentUrl = window.location.href;
|
|
const targetUrl = `/s/${keyword.value}.html`;
|
|
if (currentUrl.includes('/s/') || currentUrl.includes('/d/')) {
|
|
window.location.href = targetUrl;
|
|
} else {
|
|
window.open(targetUrl, '_blank');
|
|
}
|
|
};
|
|
|
|
// 保存按钮点击事件
|
|
const saveBtn = async () => {
|
|
if (!content.value) {
|
|
return showMessage('请输入你想看的资源信息~', 'error');
|
|
}
|
|
if (load.value) return;
|
|
|
|
load.value = true;
|
|
try {
|
|
const response = await axios.post('/api/tool/feedback', { content: content.value });
|
|
showMessage(response.data.message, response.data.code === 200 ? 'success' : 'error');
|
|
if (response.data.code === 200) {
|
|
layerVisible.value = false;
|
|
content.value = '';
|
|
}
|
|
} finally {
|
|
load.value = false;
|
|
}
|
|
};
|
|
|
|
const setnum = (num) => (num / 10000).toFixed(2) + 'W';
|
|
|
|
const goLink = (event,id) => {
|
|
event.preventDefault();
|
|
window.location.href = `/d/${id}.html`;
|
|
}
|
|
|
|
const changeBtn = (e) => {
|
|
const category_id = `{$category_id}`;
|
|
if(category_id){
|
|
window.location.href = `/s/${keyword.value}-${e}-${category_id}.html`;
|
|
}else{
|
|
window.location.href = `/s/${keyword.value}-${e}.html`;
|
|
}
|
|
};
|
|
|
|
const copyText = async(event,title,url,code) => {
|
|
event.preventDefault();
|
|
var text = '标题:'+title+'\n链接:'+url
|
|
if (code) text += `\n提取码:${code}`;
|
|
text += `\n由【${'{$config.app_name}'}${window.location.hostname}】供网盘分享链接`;
|
|
|
|
|
|
try {
|
|
// 优先使用 navigator.clipboard
|
|
await navigator.clipboard.writeText(text);
|
|
showMessage('复制成功', 'success');
|
|
} catch (err) {
|
|
// 如果 navigator.clipboard 失败,使用 document.execCommand 作为回退
|
|
const textArea = document.createElement('textarea');
|
|
textArea.value = text;
|
|
textArea.style.position = 'fixed'; // 避免滚动
|
|
textArea.style.opacity = 0;
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
const successful = document.execCommand('copy');
|
|
if (successful) {
|
|
showMessage('复制成功', 'success');
|
|
} else {
|
|
throw new Error('复制失败');
|
|
}
|
|
} catch (err) {
|
|
showMessage('复制失败,请手动复制', 'error');
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
}
|
|
|
|
const selectBtn = () => {
|
|
const boxElement = document.querySelector('.listBox .screen .fixed .box');
|
|
// 切换 display 属性,显示或隐藏
|
|
if (boxElement.style.display === 'none' || boxElement.style.display === '') {
|
|
boxElement.style.display = 'block'; // 显示
|
|
} else {
|
|
boxElement.style.display = 'none'; // 隐藏
|
|
}
|
|
}
|
|
|
|
const handleDeviceType = () => {
|
|
const isMobile = window.matchMedia('(max-width: 768px)').matches;
|
|
if (isMobile) {
|
|
// 手机端的逻辑
|
|
is_m.value = 1
|
|
} else {
|
|
// 电脑端的逻辑
|
|
is_m.value = 0
|
|
}
|
|
};
|
|
|
|
|
|
// 组件挂载时添加滚动监听
|
|
onMounted(() => {
|
|
handleDeviceType();
|
|
|
|
window.addEventListener('scroll', handleScroll);
|
|
window.addEventListener('resize', handleDeviceType);
|
|
});
|
|
|
|
// 组件卸载时移除滚动监听
|
|
onUnmounted(() => {
|
|
window.removeEventListener('scroll', handleScroll);
|
|
window.removeEventListener('resize', handleDeviceType);
|
|
});
|
|
|
|
// 返回数据和方法
|
|
return { elementOpacity, scrollThreshold, keyword, searchBtn, rankList,newList, setnum, qcodeVisible, layerVisible, content, saveBtn, rankDj,goLink,changeBtn,copyText,drawer,selectBtn,is_m };
|
|
}
|
|
})
|
|
.use(ElementPlus) // 使用 Element Plus
|
|
.mount('#app'); // 挂载 Vue 实例
|
|
</script> |