feat: 新增抱团组件和申请助手弹窗组件

新增huddle-box和helper-pop组件,包含相关图片资源和样式调整
修复item-mj组件中itemBottom导入错误
优化移动端样式适配
更新sectionV2页面引入新组件
补充公共样式和动画效果
This commit is contained in:
DESKTOP-RQ919RC\Pc
2025-12-19 19:04:34 +08:00
parent 7e830d9dcb
commit acf03efaf0
34 changed files with 2788 additions and 288 deletions

View File

@@ -1,3 +1,3 @@
{
"liveServer.settings.port": 5501
"liveServer.settings.port": 5502
}

489
best.html Normal file
View File

@@ -0,0 +1,489 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>精华主题 - 寄托天下 -- 寄托天下</title>
<link rel="stylesheet" href="https://framework.x-php.com/gter/forum/css/public.css?v=jm5aurbe8jqn" />
<link rel="stylesheet" href="/css/search-tag.css?v=jm5aurbe8jqn" />
<meta name="description" content="寄托天下留学论坛上查看精华主题">
<meta name="keywords" content="精华主题, 寄托天下, 留学论坛">
<meta name="author" content="">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:title" content="精华主题 - 寄托天下">
<meta property="og:description" content="寄托天下留学论坛上查看精华主题">
<meta property="og:image" content="">
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:title" content="精华主题 - 寄托天下">
<meta property="twitter:description" content="寄托天下留学论坛上查看精华主题">
<meta property="twitter:image" content="">
<!-- 网站图标 -->
<link rel="icon" href="https://www.gter.net/favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="https://www.gter.net/favicon.ico" type="image/x-icon">
<style>
[v-cloak] {
display: none !important;
}
#pre-loader {
height: 70vh;
display: flex;
justify-content: center;
align-items: center;
}
#pre-loader .three-bounce>div {
display: inline-block;
width: 18px;
height: 18px;
border-radius: 100%;
top: 50%;
margin-top: -9px;
background: #aeadba;
animation: bouncedelay 1.4s infinite ease-in-out;
animation-fill-mode: both;
}
#pre-loader .three-bounce .one {
animation-delay: -0.32s;
}
#pre-loader .three-bounce .two {
animation-delay: -0.16s;
}
@keyframes bouncedelay {
0%,
100%,
80% {
transform: scale(0);
-webkit-transform: scale(0);
}
40% {
transform: scale(1);
-webkit-transform: scale(1);
}
}
</style>
<script type="text/javascript">
var STYLEID = '2',
STATICURL = 'static/',
IMGDIR = 'https://bbs.gter.net/template/archy_plt8/image',
VERHASH = 'Z62',
charset = 'gbk',
discuz_uid = '0',
cookiepre = '4B5x_c0ae_',
cookiedomain = 'gter.net',
cookiepath = '/',
showusercard = '1',
attackevasive = '0',
disallowfloat = '',
creditnotice = ',',
defaultstyle = '',
REPORTURL = 'aHR0cDovL2Jicy5ndGVyLm5ldC9mb3J1bS5waHA/dGlkPTI0MDYzNTYmZ290bz1sYXN0cG9zdA==',
SITEURL = 'https://app.gter.net/',
JSPATH = 'static/js/';
</script>
<script src="https://app.gter.net/bottom?tpl=header&menukey=bbs"></script>
<script src="https://framework.x-php.com/gter/bbs/static/js/common.js" charset="gbk"></script>
</head>
<body>
<script>
window.__ASSET_VERSION__ = 'Z69';
// 判断是否是移动端
window.isMobile = window.innerWidth <= 768;
</script>
<div id="ajaxwaitid"></div>
<div id="append_parent"></div>
<div class="head-top flexacenter" style="width: 1200px;margin: 20px auto 30px;">
<a href="/" class="flexacenter" target="_blank">
<img class="logo" src="https://oss.gter.net/logo" alt="" />
</a>
<div class="flex1"></div>
<div class="input-box flexacenter">
<div class="placeholder">
<div class="placeholder-box" style="transition: transform .3s ease"></div>
</div>
<input class="input flex1" type="text" maxlength="140" /> <img class="icon" onclick="searchEvent()" src="https://framework.x-php.com/gter/forum/img/search-icon.svg?v=jm5aurbe8jqn" />
<div class="search-box-history">
<div class="search-box-history-title">历史搜索</div>
<div class="search-box-history-list"></div>
</div>
</div>
<div class="post-list flexacenter"> </div>
<div class="sign-in sign-in-no flexacenter"></div>
<div class="head-more flexcenter" onclick="openHeadPop()">
<img class="more-icon" style="width: 18px;height: 15px;" src="https://framework.x-php.com/gter/forum/img/threeAcross.svg?v=jm5aurbe8jqn" />
</div>
<div class="head-pop" style="display: none;">
<div class="head-more-pop">
<div class="head-more-userinfo flex1 flexacenter">
<div class="head-more-left flexacenter"><img class="head-more-userinfo-avatar" src="" alt="">
<div class="head-more-userinfo-username"></div>
</div>
<div class="head-more-right">
<div class="loginBtn flexcenter" onclick="go_ajax_Login()">登录/注册</div>
</div>
</div>
<div class="tab-list"><a class="tab-item flexacenter" href="https://www.gter.net" target="_blank">寄托首页</a><a class="tab-item flexacenter pitch" href="https://f.gter.net" target="_blank">论坛</a><a class="tab-item flexacenter" href="https://app.gter.net/admissionOfficer" target="_blank">招生官</a><a class="tab-item flexacenter" href="https://bbs.gter.net/thread-2345065-1-1.html" target="_blank">加群</a><a class="tab-item flexacenter" href="https://offer.gter.net" target="_blank">Offer榜</a></div>
<a class="head-more-post flexcenter" href="/publish" target="" onclick="skipLoginUrl(event)">
<div class="head-more-post-icon flexcenter"><img class="head-more-post-img" src="https://framework.x-php.com/gter/forum/img/addyellow.svg?v=jm5aurbe8jqn" /></div>发布帖子
</a>
<img class="cross-icon" onclick="crossHeadPop()" src="https://framework.x-php.com/gter/forum/img/cross.svg?v=jm5aurbe8jqn">
</div>
</div>
</div>
<div class="valueA" style="display: none;">https://framework.x-php.com/gter/forum/</div>
<div class="container" id="search-tag">
<div class="templateValue" ref="tagValue"></div>
<div class="templateValue" ref="typeValue"></div>
<!-- <div class="set-hint-box flexacenter">
<img class="set-hint-icon" src="./img/essence-icon.png">
<div class="set-hint-text">被小编设置为"精华"的帖子</div>
</div> -->
<div class="label-title flexacenter">
<img class="icon" src="https://framework.x-php.com/gter/forum/img/essence-head-icon.png?v=jm5aurbe8jqn" />
<div class="text">精华帖</div>
</div>
<div class="classify flexacenter" v-cloak>
<div class="item" :class="{'pitch': key == tabValue}" v-for="(item, key) in tabList" :key="key" @click="cutTab(key)">{{ item }}</div>
</div>
<div id="pre-loader">
<div class="three-bounce" p-id="11">
<div class="one" p-id="12"></div>
<div class="two" p-id="13"></div>
<div class="three" p-id="14"></div>
</div>
</div>
<div class="matter flexflex" ref="matterRef" v-cloak>
<div class="matter-content flex1" ref="contentRef" :style="{'top': matterHeight + 'px'}">
<div class="quantity flexacenter" v-cloak>
{{ tabList[tabValue] }}
<div class="line"></div>
<div class="num">{{ count }}</div>
<div class="sort-area">
<div class="sort-head flexacenter" @click="toggleSort()">
<div class="text">{{ currentSortText }}</div>
<img class="icon " :class="{'rotate': showSort}" src="https://app.gter.net/image/miniApp/offer/triangle-black.svg" />
</div>
<div class="sort-mask" @click="hideSort()" v-if="showSort"></div>
<div class="sort-box" v-if="showSort">
<div class="item" :class="{'pitch': orderBy == '_score'}" @click="selectSort('_score')">按综合排序</div>
<div class="item" :class="{'pitch': orderBy == 'id'}" @click="selectSort('id')">按最新发布排序</div>
</div>
</div>
</div>
<div class="list-box" v-if="list.length != 0">
<template v-for="(item,index) in list" :key="index">
<item-offer v-if=" item.type == 'offer'" :itemdata="item"></item-offer>
<item-summary v-else-if="item.type == 'offer_summary'" :itemdata="item"></item-summary>
<item-vote v-else-if="item.type == 'vote'" :itemdata="item"></item-vote>
<item-mj v-else-if="item.type == 'interviewexperience'" :itemdata="item"></item-mj>
<item-tenement v-else-if="item.type == 'tenement'" :itemdata="item"></item-tenement>
<item-forum v-else :itemdata="item"></item-forum>
</template>
</div>
<load-box :loading="loading"></load-box>
<div v-if="list.length == 0 && page == null" class="empty flexcenter">
<img class="empty-icon" src="https://framework.x-php.com/gter/forum/img/empty-icon.png?v=jm5aurbe8jqn" />
<div class="empty-text">- 暂无内容 -</div>
</div>
<div class="pages-box flexcenter" v-if="pagination.length != 0">
<img v-if="page == 1" class="arrows" src="https://framework.x-php.com/gter/forum/img/arrows-gray-simple.svg?v=jm5aurbe8jqn" alt="">
<img @click="prevPage" v-else class="arrows rotate180" src="https://framework.x-php.com/gter/forum/img/arrows-gray-deep.svg?v=jm5aurbe8jqn" alt="">
<div class="item" :class="{'pitch': item == page }" v-for="(item, index) in pagination" @click="cutPage(item)">{{ item }}</div>
<img v-if="page == maxPage" class="arrows rotate180" src="https://framework.x-php.com/gter/forum/img/arrows-gray-simple.svg?v=jm5aurbe8jqn" alt="">
<img @click="nextPage" v-else v-else class="arrows" src="https://framework.x-php.com/gter/forum/img/arrows-gray-deep.svg?v=jm5aurbe8jqn" alt="">
</div>
</div>
<div class="sidebar-box" ref="sidebarRef" :style="{'top': sidebarHeight + 'px'}" style="padding-top: 40px;">
<div class="recommend-and-essence flexacenter">
<a class="item flexcenter" target="_blank" href="/recommend">
<img class="icon" src="/img/recommend-head-icon.png" />
<div class="text">编辑推荐</div>
</a>
<a class="item flexcenter" target="_blank" href="/best">
<img class="icon" src="/img/essence-head-icon.png" />
<div class="text">精华帖</div>
</a>
</div>
<hot-tag></hot-tag>
<hot-search></hot-search>
<slideshow-box></slideshow-box>
<latest-list></latest-list>
</div>
</div>
</div>
<script src="https://framework.x-php.com/gter/forum/js/vue.global.js?v=jm5aurbe8jqn"></script>
<script src="https://framework.x-php.com/gter/forum/js/axios.min.js?v=jm5aurbe8jqn"></script>
<script src="https://framework.x-php.com/gter/forum/js/public.js?v=jm5aurbe8jqn"></script>
<!-- <script src="https://f.gter.net/js/public.js"></script> -->
<!-- <script type="module" src="https://framework.x-php.com/gter/forum/js/search-tag.js?v=jm5aurbe8jqn"></script> -->
<script type="module" src="https://framework.x-php.com/gter/forum/js/best.js?v=jm5aurbe8jqn"></script>
<!-- <script type="module" src="https://f.gter.net/js/best.js"></script> -->
<script type="module" src="https://framework.x-php.com/gter/forum/../image/gter/commonCom/sign-in/sign-in.js?v=jm5aurbe8jqn"></script>
<script src="https://app.gter.net/bottom?tpl=footer,popupnotification"></script>
<script>
console.log(location.href.indexOf('details') != -1);
if (location.href.indexOf('details') != -1) {
const postList = document.querySelector('.head-top .post-list')
postList.innerHTML = `<a href="/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="https://framework.x-php.com/gter/forum/img/post-thread.png?v=jm5aurbe8jqn" /> </a> <a href="https://offer.gter.net/post" target="_blank" style="margin-right: 10px"> <img class="post-item" src="https://framework.x-php.com/gter/forum/img/post-offer.png?v=jm5aurbe8jqn" /> </a> <a href="https://offer.gter.net/post/summary" target="_blank" style="margin-right: 10px"> <img class="post-item" src="https://framework.x-php.com/gter/forum/img/post-summary.png?v=jm5aurbe8jqn" /> </a> <a href="https://interviewexperience.gter.net/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="https://framework.x-php.com/gter/forum/img/post-mj.png?v=jm5aurbe8jqn" /> </a> <a href="https://vote.gter.net/publish" target="_blank"> <img class="post-item" src="https://framework.x-php.com/gter/forum/img/post-vote.png?v=jm5aurbe8jqn" /> </a>`
console.log(postList);
postList.style.display = 'flex'
} else if (location.href.indexOf('search') != -1) {
const box = document.querySelector(".head-top")
box.querySelector(".input-box").style.display = "none"
box.querySelector(".sign-in").style.display = "none"
} else if (location.href.indexOf("publish") != -1) {
const box = document.querySelector(".head-top")
if (box) document.body.removeChild(box)
} else {
const signIn = document.querySelector('.head-top .sign-in')
signIn.innerHTML = `<div class="sign-in-no-box" onclick="headSignIn()">
<img class="sign-in-bj" src="https://framework.x-php.com/gter/forum/img/sign-in-bj.svg?v=jm5aurbe8jqn" /><img class="coin-bj" src="https://framework.x-php.com/gter/forum/img/coin-bj.svg?v=jm5aurbe8jqn" />
<img class="coin-icon" src="https://framework.x-php.com/gter/forum/img/coin-icon.png?v=jm5aurbe8jqn" /><span class="text flex1">签到领寄托币</span>
<div class="sign-go flexcenter">
<img class="sign-go-bj" src="https://framework.x-php.com/gter/forum/img/sign-go.svg?v=jm5aurbe8jqn" /> GO
</div>
<img class="petal1" src="https://framework.x-php.com/gter/forum/img/petal1.png?v=jm5aurbe8jqn" />
<img class="petal2" src="https://framework.x-php.com/gter/forum/img/petal2.png?v=jm5aurbe8jqn" />
<img class="petal3" src="https://framework.x-php.com/gter/forum/img/petal3.png?v=jm5aurbe8jqn" />
</div>
<div class="sign-in-already-box">
<img class="sign-icon" src="https://framework.x-php.com/gter/forum/img/sign-icon.png?v=jm5aurbe8jqn" />
<span>已签到,明天再来</span>
</div>`
signIn.style.display = 'flex'
let userInfoWinTimerCount = 0;
const userInfoWinTimer = setInterval(() => {
if (location.host == "127.0.0.1:5501") return;
if (todaysignedState) {
clearInterval(userInfoWinTimer);
if (todaysigned == 1) {
signIn.classList.add('sign-in-already')
signIn.classList.remove("sign-in-no");
}
}
userInfoWinTimerCount++;
if (userInfoWinTimerCount >= 3000) clearInterval(userInfoWinTimer);
}, 50);
}
function headSignIn() {
SignInComponent.initComponent();
}
const searchInput = document.querySelector('.head-top .input')
// 绑定 blur 和 focus 事件
if (searchInput) {
searchInput.addEventListener('blur', function () {
setTimeout(() => {
const historyBox = document.querySelector('.head-top .search-box-history')
if (historyBox) historyBox.style.display = 'none'
}, 300);
const inputBox = document.querySelector('.head-top .input-box')
if (inputBox) inputBox.classList.remove('pitch')
startCarousel();
})
searchInput.addEventListener('focus', () => {
const historyBox = document.querySelector('.head-top .search-box-history')
const historyItem = historyBox.querySelectorAll(".search-box-history-item")
if (historyBox && historyItem.length > 0) historyBox.style.display = 'block'
const inputBox = document.querySelector('.head-top .input-box')
if (inputBox) inputBox.classList.add('pitch')
if (carouselTimer) clearInterval(carouselTimer);
})
// 绑定回车事件
searchInput.addEventListener('keydown', (e) => {
if (e.key == 'Enter') searchEvent()
})
searchInput.addEventListener('input', (e) => {
const value = e.target.value || ''
const placeholder = document.querySelector(".head-top .placeholder")
if (value) placeholder.style.display = 'none'
else placeholder.style.display = 'block'
})
}
let historySearchList = []
// 获取历史搜索
const getHistorySearch = () => {
const data = JSON.parse(localStorage.getItem("history-search")) || [];
historySearchList = data;
let itemAll = ``
data.forEach((item, index) => itemAll += `<div class="search-box-history-item one-line-display" onclick="searchEvent('${item}')">${item}</div>`) // 绑定事件 searchEvent 点击搜索)
const historyList = document.querySelector('.search-box-history-list')
historyList.innerHTML = itemAll
};
if (location.href.indexOf("/publish") == -1 && location.href.indexOf("/search") == -1) getHistorySearch();
const searchEvent = (value) => {
if (window.innerWidth <= 480) {
redirectToExternalWebsite("/search");
return
}
const kw = value || searchInput.value || hotSearchWords[currentIndex]?.keyword || "";;
if (!kw) return;
historySearchList.unshift(kw);
historySearchList = [...new Set(historySearchList)];
if (historySearchList.length > 10) historySearchList = historySearchList.splice(0, 10);
localStorage.setItem("history-search", JSON.stringify(historySearchList));
redirectToExternalWebsite("/search/" + kw);
searchInput.value = ""
}
let hotSearchWords = [];
const renderingPlaceholder = () => {
let itemAll = ``
hotSearchWords.forEach(item => {
itemAll += `<div class="item one-line-display" >大家都在搜:${item.keyword}</div>`
})
const sliceHotSearchWords = hotSearchWords.slice(0, 2)
sliceHotSearchWords.forEach(item => {
itemAll += `<div class="item one-line-display" >大家都在搜:${item.keyword}</div>`
})
const placeholderBox = document.querySelector('.placeholder .placeholder-box')
placeholderBox.innerHTML = itemAll
}
const getWConfigg = () => {
ajaxGet("/v2/api/config/website").then((res) => {
if (res.code == 200) {
let data = res["data"] || {};
hotSearchWords = data.hotSearchWords || [];
renderingPlaceholder()
data.time = new Date().toISOString();
localStorage.setItem("wConfig", JSON.stringify(data));
}
});
};
const checkWConfig = () => {
const wConfig = JSON.parse(localStorage.getItem("wConfig")) || {};
if (wConfig.time) {
const time = new Date(wConfig.time);
const now = new Date();
if (now - time > 24 * 60 * 60 * 1000) getWConfigg();
else {
hotSearchWords = wConfig.hotSearchWords || [];
renderingPlaceholder()
}
} else getWConfigg();
};
checkWConfig()
const renderCurrentIndex = () => {
const placeholderBox = document.querySelector('.placeholder .placeholder-box')
if (placeholderBox) placeholderBox.style.transform = `translateY(${-currentIndex * 36}px)`
}
let currentIndex = 0; // 当前显示的关键词索引
let carouselTimer = null; // 轮播定时器
// 启动轮播函数
const startCarousel = () => {
// 清除已有的定时器
if (carouselTimer) clearInterval(carouselTimer);
// 设置新的定时器,每秒滚动一次
carouselTimer = setInterval(() => {
if (hotSearchWords.length > 1) {
if (currentIndex >= hotSearchWords.length - 1) {
currentIndex++;
setTimeout(() => {
currentIndex = 0;
}, 2300);
} else currentIndex++;
}
renderCurrentIndex()
}, 2300);
};
startCarousel();
const openHeadPop = () => {
if (window["userInfoWin"]?.uin > 0 || window["userInfoWin"]?.uid > 0) {
// 登录
const headMoreLeft = document.querySelector(".head-pop .head-more-left")
headMoreLeft.innerHTML = `<img class="head-more-userinfo-avatar" src="${window["userInfoWin"]?.avatar}" alt=""><div class="head-more-userinfo-username">${window["userInfoWin"]?.nickname}</div>`
} else {
const avatar = document.querySelector(".head-pop .head-more-userinfo-avatar")
avatar.src = "/img/defaultAvatar.png"
const headMoreRight = document.querySelector(".head-pop .head-more-right")
headMoreRight.style.display = "block"
}
document.querySelector(".head-pop").classList.add("head-pop-show");
}
const skipLoginUrl = (e) => {
if (window["userInfoWin"]?.uin > 0 || window["userInfoWin"]?.uid > 0) { }
else {
e.preventDefault();
go_ajax_Login();
}
}
const crossHeadPop = () => document.querySelector(".head-pop").classList.remove("head-pop-show");
</script>
</body>
</html>

View File

@@ -0,0 +1,30 @@
// my-component.js
// 引入全局 Vue 对象(因在 HTML 中通过 script 引入Vue 已挂载到 window
const { defineComponent, ref, inject, defineAsyncComponent, onMounted } = Vue;
// 定义组件(直接使用模板)
export const helperPop = defineComponent({
name: "item-bottom",
props: {},
setup(props) {
let isMobile = ref(false);
let state = ref(false);
onMounted(() => {
isMobile.value = window.isMobile;
});
const open = () => (state.value = true);
const closeGroup = () => (state.value = false);
const holdback = () => {};
return { state, isMobile, holdback, closeGroup, open };
},
components: {},
template: `<div class="helper-pop flexflex" v-if="state" @click="closeGroup" @touchmove.prevent> <div class="helper-box flexacenter" @click.stop="holdback"> <img class="cross-grey" @click.stop="closeGroup" src="../../img/cross-grey.png" alt=""> <img class="helper-text helper-text1" src="../../img/apply-for-name.png" alt=""> <div class="helper-box-box flexflex"> <div class="helper-QRcode-box flexcenter"> <img class="left-top helper-QRcode-box-icon" src="../../img/yellow-border.svg" alt=""> <img class="left-bottom helper-QRcode-box-icon" src="../../img/yellow-border.svg" alt=""> <img class="right-top helper-QRcode-box-icon" src="../../img/yellow-border.svg" alt=""> <img class="right-bottom helper-QRcode-box-icon" src="../../img/yellow-border.svg" alt=""> <img class="helper-QRcode-img" src="https://u.gter.net/assistantwxqrcode.png" alt=""> </div> <span class="helper-box-text">长按识别二维码</span> </div> <img class="helper-bottom" src="../../img/helper-bottom-yellow.svg" alt=""> <img class="helper-bottom" src="../../img/helper-bottom-blue.svg" alt=""> </div></div>`,
});

View File

@@ -0,0 +1,18 @@
<div class="helper-pop flexflex" v-if="state" @click="closeGroup" @touchmove.prevent>
<div class="helper-box flexacenter" @click.stop="holdback">
<img class="cross-grey" @click.stop="closeGroup" src="../../img/cross-grey.png" alt="">
<img class="helper-text helper-text1" src="../../img/apply-for-name.png" alt="">
<div class="helper-box-box flexflex">
<div class="helper-QRcode-box flexcenter">
<img class="left-top helper-QRcode-box-icon" src="../../img/yellow-border.svg" alt="">
<img class="left-bottom helper-QRcode-box-icon" src="../../img/yellow-border.svg" alt="">
<img class="right-top helper-QRcode-box-icon" src="../../img/yellow-border.svg" alt="">
<img class="right-bottom helper-QRcode-box-icon" src="../../img/yellow-border.svg" alt="">
<img class="helper-QRcode-img" src="https://u.gter.net/assistantwxqrcode.png" alt="">
</div>
<span class="helper-box-text">长按识别二维码</span>
</div>
<img class="helper-bottom" src="../../img/helper-bottom-yellow.svg" alt="">
<img class="helper-bottom" src="../../img/helper-bottom-blue.svg" alt="">
</div>
</div>

View File

@@ -0,0 +1,30 @@
// my-component.js
// 引入全局 Vue 对象(因在 HTML 中通过 script 引入Vue 已挂载到 window
const { defineComponent, ref, inject, defineAsyncComponent, onMounted } = Vue;
// 定义组件(直接使用模板)
export const huddleBox = defineComponent({
name: "item-bottom",
props: {},
setup(props) {
let isMobile = ref(false);
let state = ref(false);
onMounted(() => {
isMobile.value = window.isMobile;
});
const open = () => (state.value = true);
const closeGroup = () => (state.value = false);
const holdback = () => {};
return { state, isMobile, holdback, closeGroup, open };
},
components: {},
template: `<div class="huddle-box" @click="closeGroup" v-if="state"> <div class="box flexflex" @click.stop="holdback"> <img class="bj" src="../../img/group-bj.svg" alt=""> <img class="bj-bottom" src="../../img/group-bottom.png" alt=""> <img class="top" src="../../img/group-top.png" alt=""> <img class="title" src="../../img/group-title.png" alt=""> <div class="text">抱团 / 信息共享 / 互助申学</div> <div class="case flexflex"> <div class="QRcode flexcenter"> <img class="img" src="https://o.x-php.com/Zvt57TuJSUvkyhw-xG7Y2l-c-5kpcnzqqsgFptxhcq_cQnrlJKN1WgxCBq_D-81qNDQyOQ~~" alt=""> </div> <div class="hint flexcenter"> <img class="img img-left" src="../../img/group-arrows.png" alt=""> <span class="hint-text">添加寄托葱哥进群</span> <img class="img" src="../../img/group-arrows.png" alt=""> </div> </div> </div> </div>`,
});

View File

@@ -0,0 +1,19 @@
<div class="huddle-box" @click="closeGroup" v-if="state">
<div class="box flexflex" @click.stop="holdback">
<img class="bj" src="../../img/group-bj.svg" alt="">
<img class="bj-bottom" src="../../img/group-bottom.png" alt="">
<img class="top" src="../../img/group-top.png" alt="">
<img class="title" src="../../img/group-title.png" alt="">
<div class="text">抱团 / 信息共享 / 互助申学</div>
<div class="case flexflex">
<div class="QRcode flexcenter">
<img class="img" src="https://o.x-php.com/Zvt57TuJSUvkyhw-xG7Y2l-c-5kpcnzqqsgFptxhcq_cQnrlJKN1WgxCBq_D-81qNDQyOQ~~" alt="">
</div>
<div class="hint flexcenter">
<img class="img img-left" src="../../img/group-arrows.png" alt="">
<span class="hint-text">添加寄托葱哥进群</span>
<img class="img" src="../../img/group-arrows.png" alt="">
</div>
</div>
</div>
</div>

View File

@@ -5,7 +5,7 @@ const { defineComponent, ref, defineAsyncComponent } = Vue;
// const { itemBottom } = await import(withVer("../item-bottom/item-bottom.js"));
// const { itemHead } = await import(withVer("../item-head/item-head.js"));
const itemHead = defineAsyncComponent(() => import(withVer("../item-head/item-head.js")).then((m) => m.itemHead));
const itemBottom = defineAsyncComponent(() => import(withVer("../item-bottom/item-bottom.js")).then((m) => m.itemHead));
const itemBottom = defineAsyncComponent(() => import(withVer("../item-bottom/item-bottom.js")).then((m) => m.itemBottom));
// 定义组件(直接使用模板)
export const itemMj = defineComponent({

View File

@@ -57,7 +57,6 @@ body {
border-radius: 10px;
padding: 18px 20px 0;
display: block;
overflow: hidden;
}
.item-box .item-head {
margin-bottom: 14px;
@@ -2184,3 +2183,342 @@ td {
padding: 0 5px;
}
}
.huddle-box {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.70588235);
display: flex;
align-items: flex-end;
justify-content: center;
overflow: hidden;
animation: slidebj 0.5s forwards;
z-index: 10002;
}
.huddle-box .box {
width: 100vw;
height: 719px;
border-radius: 20px 20px 0 0;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.10196078);
animation: slideUp 0.5s forwards;
background: linear-gradient(0.0796881deg, #c1a75a 0%, #15a3dc 100%);
position: relative;
flex-direction: column;
align-items: center;
padding-top: 32px;
z-index: 1;
}
.huddle-box .box .code {
width: 100vw;
}
.huddle-box .box .bj {
width: 100vw;
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
z-index: -1;
}
.huddle-box .box .bj-bottom {
width: 126px;
height: 134px;
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
}
.huddle-box .box .top {
width: 199px;
height: 36px;
margin-bottom: 13px;
}
.huddle-box .box .title {
width: 311px;
height: 86px;
margin-bottom: 4px;
}
.huddle-box .box .text {
font-family: "PingFangSC-Regular", "PingFang SC", sans-serif;
font-weight: 400;
font-style: normal;
font-size: 20px;
color: #ffffff;
text-align: center;
line-height: 30px;
margin-bottom: 25px;
}
.huddle-box .box .case {
width: 360px;
height: 400px;
background: linear-gradient(180deg, #f2f2f2 0%, #ebebeb 100%);
border-radius: 15px;
flex-direction: column;
align-items: center;
padding-top: 50px;
margin: 0 auto;
}
.huddle-box .box .case .QRcode {
width: 240px;
height: 240px;
background-color: #ffffff;
border-color: #f2f2f2;
border-radius: 10px;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.18431373);
margin-bottom: 26px;
}
.huddle-box .box .case .QRcode .img {
width: 218px;
height: 218px;
}
.huddle-box .box .case .hint .img {
width: 32px;
height: 32px;
}
.huddle-box .box .case .hint .img.img-left {
transform: rotate(180deg);
}
.huddle-box .box .case .hint .hint-text {
font-size: 18px;
color: #000000;
text-align: center;
line-height: 28px;
margin: 0 15px;
}
@media screen and (max-width: 600px) {
.huddle-box .box {
width: 100vw;
height: calc(719 / 600 * 100vw);
padding-top: calc(32 / 600 * 100vw);
box-shadow: 0 0 calc(15 / 600 * 100vw) rgba(0, 0, 0, 0.10196078);
animation-name: slideUp;
}
.huddle-box .box .code {
width: 100vw;
}
.huddle-box .box .bj-bottom {
width: calc(126 / 600 * 100vw);
height: calc(134 / 600 * 100vw);
}
.huddle-box .box .top {
width: calc(199 / 600 * 100vw);
height: calc(36 / 600 * 100vw);
margin-bottom: calc(13 / 600 * 100vw);
}
.huddle-box .box .title {
width: calc(311 / 600 * 100vw);
height: calc(86 / 600 * 100vw);
margin-bottom: calc(4 / 600 * 100vw);
}
.huddle-box .box .text {
font-size: calc(20 / 600 * 100vw);
line-height: calc(30 / 600 * 100vw);
margin-bottom: calc(25 / 600 * 100vw);
}
.huddle-box .box .case {
width: calc(360 / 600 * 100vw);
height: calc(400 / 600 * 100vw);
padding-top: calc(50 / 600 * 100vw);
border-radius: calc(15 / 600 * 100vw);
}
.huddle-box .box .case .QRcode {
width: calc(240 / 600 * 100vw);
height: calc(240 / 600 * 100vw);
margin-bottom: calc(26 / 600 * 100vw);
border-radius: calc(10 / 600 * 100vw);
box-shadow: 0 0 calc(5 / 600 * 100vw) rgba(0, 0, 0, 0.18431373);
}
.huddle-box .box .case .QRcode .img {
width: calc(218 / 600 * 100vw);
height: calc(218 / 600 * 100vw);
}
.huddle-box .box .case .hint .img {
width: calc(32 / 600 * 100vw);
height: calc(32 / 600 * 100vw);
}
.huddle-box .box .case .hint .hint-text {
font-size: calc(18 / 600 * 100vw);
line-height: calc(28 / 600 * 100vw);
margin: 0 calc(15 / 600 * 100vw);
}
}
@keyframes slidebj {
0% {
background-color: rgba(0, 0, 0, 0);
}
100% {
background-color: rgba(0, 0, 0, 0.71764706);
}
}
.helper-pop {
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.71764706);
position: fixed;
top: 0;
left: 0;
z-index: 1004;
align-items: flex-end;
box-sizing: border-box;
animation: slidebj 0.5s forwards;
display: flex;
justify-content: center;
overflow: hidden;
}
.helper-pop .helper-box {
animation: slideUp 0.5s forwards;
box-sizing: border-box;
flex-direction: column;
width: 100vw;
background: linear-gradient(179.80708565deg, #c1cefa 0%, #e2edfb 28%, #ffffff 60%);
border: none;
border-radius: 20px;
border-bottom-right-radius: 0px;
border-bottom-left-radius: 0px;
box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.10196078);
position: relative;
padding-top: 59px;
display: flex;
align-items: center;
}
.helper-pop .helper-box .cross-grey {
width: 16px;
height: 16px;
position: absolute;
top: 13px;
right: 13px;
padding: 7px;
cursor: pointer;
}
.helper-pop .helper-box .helper-text {
box-sizing: border-box;
height: 103px;
margin: 0 auto 24px;
}
.helper-pop .helper-box .helper-box-box {
box-sizing: border-box;
width: 280px;
background: linear-gradient(139.427577deg, #6589f2 0%, #74b1f0 100%);
border: none;
border-radius: 20px;
box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.17647059);
flex-direction: column;
align-items: center;
padding: 20px 0;
z-index: 1;
margin-bottom: 80px;
display: flex;
}
.helper-pop .helper-box .helper-box-box .helper-box-text {
box-sizing: border-box;
font-size: 16px;
color: #ffffff;
text-align: center;
line-height: 28px;
margin-top: 20px;
}
.helper-pop .helper-box .helper-QRcode-box {
box-sizing: border-box;
width: 240px;
height: 240px;
background-color: #ffffff;
border-radius: 6px;
position: relative;
display: flex;
justify-content: center;
align-items: center;
}
.helper-pop .helper-box .helper-QRcode-box .helper-QRcode-box-icon {
width: 24px;
height: 24px;
position: absolute;
}
.helper-pop .helper-box .helper-QRcode-box .left-top {
top: 0;
left: 0;
transform: rotate(-90deg);
}
.helper-pop .helper-box .helper-QRcode-box .left-bottom {
bottom: 0;
left: 0;
transform: rotate(180deg);
}
.helper-pop .helper-box .helper-QRcode-box .right-top {
right: 0;
top: 0;
}
.helper-pop .helper-box .helper-QRcode-box .right-bottom {
right: 0;
bottom: 0;
transform: rotate(90deg);
}
.helper-pop .helper-box .helper-QRcode-box .helper-QRcode-img {
width: 220px;
height: 220px;
box-sizing: border-box;
}
.helper-pop .helper-box .helper-bottom {
position: absolute;
bottom: 0;
left: 0;
width: 100vw;
height: 151px;
}
@media screen and (max-width: 600px) {
.helper-pop .helper-box {
width: 100vw;
padding-top: calc(59 / 600 * 100vw);
border-radius: calc(20 / 600 * 100vw);
border-bottom-right-radius: 0px;
border-bottom-left-radius: 0px;
box-shadow: 0px 0px calc(15 / 600 * 100vw) rgba(0, 0, 0, 0.10196078);
}
.helper-pop .helper-box .cross-grey {
width: calc(16 / 600 * 100vw);
height: calc(16 / 600 * 100vw);
top: calc(13 / 600 * 100vw);
right: calc(13 / 600 * 100vw);
padding: calc(7 / 600 * 100vw);
}
.helper-pop .helper-box .helper-text {
height: calc(103 / 600 * 100vw);
margin: 0 auto calc(24 / 600 * 100vw);
}
.helper-pop .helper-box .helper-box-box {
width: calc(280 / 600 * 100vw);
border-radius: calc(20 / 600 * 100vw);
box-shadow: 0px 0px calc(15 / 600 * 100vw) rgba(0, 0, 0, 0.17647059);
padding: calc(20 / 600 * 100vw) 0;
margin-bottom: calc(80 / 600 * 100vw);
}
.helper-pop .helper-box .helper-box-box .helper-box-text {
font-size: calc(16 / 600 * 100vw);
line-height: calc(28 / 600 * 100vw);
margin-top: calc(20 / 600 * 100vw);
}
.helper-pop .helper-box .helper-QRcode-box {
width: calc(240 / 600 * 100vw);
height: calc(240 / 600 * 100vw);
border-radius: calc(6 / 600 * 100vw);
}
.helper-pop .helper-box .helper-QRcode-box .helper-QRcode-box-icon {
width: calc(24 / 600 * 100vw);
height: calc(24 / 600 * 100vw);
}
.helper-pop .helper-box .helper-QRcode-box .helper-QRcode-img {
width: calc(220 / 600 * 100vw);
height: calc(220 / 600 * 100vw);
}
.helper-pop .helper-box .helper-bottom {
height: calc(151 / 600 * 100vw);
}
}
@keyframes slideUp {
0% {
top: 100%;
}
100% {
top: 0;
}
}

View File

@@ -2629,3 +2629,399 @@ td {
padding: 0 5px;
}
}
.huddle-box {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.705882352941177);
display: flex;
align-items: flex-end;
justify-content: center;
overflow: hidden;
animation: slidebj 0.5s forwards;
z-index: 10002;
.box {
width: 100vw;
height: 719px;
border-radius: 20px 20px 0 0;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.101960784313725);
animation: slideUp 0.5s forwards;
background: linear-gradient(0.0796881deg, #c1a75a 0%, #15a3dc 100%);
position: relative;
flex-direction: column;
align-items: center;
padding-top: 32px;
z-index: 1;
.code {
width: 100vw;
}
.bj {
width: 100vw;
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
z-index: -1;
}
.bj-bottom {
width: 126px;
height: 134px;
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
}
.top {
width: 199px;
height: 36px;
margin-bottom: 13px;
}
.title {
width: 311px;
height: 86px;
margin-bottom: 4px;
}
.text {
font-family: "PingFangSC-Regular", "PingFang SC", sans-serif;
font-weight: 400;
font-style: normal;
font-size: 20px;
color: #ffffff;
text-align: center;
line-height: 30px;
margin-bottom: 25px;
}
.case {
width: 360px;
height: 400px;
background: linear-gradient(180deg, rgba(242, 242, 242, 1) 0%, rgba(235, 235, 235, 1) 100%);
border-radius: 15px;
flex-direction: column;
align-items: center;
padding-top: 50px;
margin: 0 auto;
.QRcode {
width: 240px;
height: 240px;
background-color: rgba(255, 255, 255, 1);
border-color: rgba(242, 242, 242, 1);
border-radius: 10px;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.184313725490196);
margin-bottom: 26px;
.img {
width: 218px;
height: 218px;
}
}
.hint {
.img {
width: 32px;
height: 32px;
&.img-left {
transform: rotate(180deg);
}
}
.hint-text {
font-size: 18px;
color: #000000;
text-align: center;
line-height: 28px;
margin: 0 15px;
}
}
}
}
@media screen and (max-width: 600px) {
.box {
width: 100vw;
height: calc(719 / 600 * 100vw);
padding-top: calc(32 / 600 * 100vw);
// border-radius: calc(30 / 600 * 100vw) calc(30 / 600 * 100vw) 0 0;
box-shadow: 0 0 calc(15 / 600 * 100vw) rgba(0, 0, 0, 0.101960784313725);
animation-name: slideUp;
.code {
width: 100vw;
}
.bj-bottom {
width: calc(126 / 600 * 100vw);
height: calc(134 / 600 * 100vw);
}
.top {
width: calc(199 / 600 * 100vw);
height: calc(36 / 600 * 100vw);
margin-bottom: calc(13 / 600 * 100vw);
}
.title {
width: calc(311 / 600 * 100vw);
height: calc(86 / 600 * 100vw);
margin-bottom: calc(4 / 600 * 100vw);
}
.text {
font-size: calc(20 / 600 * 100vw);
line-height: calc(30 / 600 * 100vw);
margin-bottom: calc(25 / 600 * 100vw);
}
.case {
width: calc(360 / 600 * 100vw);
height: calc(400 / 600 * 100vw);
padding-top: calc(50 / 600 * 100vw);
border-radius: calc(15 / 600 * 100vw);
.QRcode {
width: calc(240 / 600 * 100vw);
height: calc(240 / 600 * 100vw);
margin-bottom: calc(26 / 600 * 100vw);
border-radius: calc(10 / 600 * 100vw);
box-shadow: 0 0 calc(5 / 600 * 100vw) rgba(0, 0, 0, 0.184313725490196);
.img {
width: calc(218 / 600 * 100vw);
height: calc(218 / 600 * 100vw);
}
}
.hint {
.img {
width: calc(32 / 600 * 100vw);
height: calc(32 / 600 * 100vw);
}
.hint-text {
font-size: calc(18 / 600 * 100vw);
line-height: calc(28 / 600 * 100vw);
margin: 0 calc(15 / 600 * 100vw);
}
}
}
}
}
}
@keyframes slidebj {
0% {
background-color: rgba(0, 0, 0, 0);
}
100% {
background-color: rgba(0, 0, 0, 0.717647058823529);
}
}
.helper-pop {
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.717647058823529);
position: fixed;
top: 0;
left: 0;
z-index: 1004;
align-items: flex-end;
box-sizing: border-box;
animation: slidebj 0.5s forwards;
display: flex;
justify-content: center;
overflow: hidden;
.helper-box {
animation: slideUp 0.5s forwards;
box-sizing: border-box;
flex-direction: column;
width: 100vw;
background: linear-gradient(179.807085646467deg, rgba(193, 206, 250, 1) 0%, rgba(226, 237, 251, 1) 28%, rgba(255, 255, 255, 1) 60%);
border: none;
border-radius: 20px;
border-bottom-right-radius: 0px;
border-bottom-left-radius: 0px;
box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.101960784313725);
position: relative;
padding-top: 59px;
display: flex;
align-items: center;
.cross-grey {
width: 16px;
height: 16px;
position: absolute;
top: 13px;
right: 13px;
padding: 7px;
cursor: pointer;
}
.helper-text {
box-sizing: border-box;
height: 103px;
margin: 0 auto 24px;
}
.helper-box-box {
box-sizing: border-box;
width: 280px;
background: linear-gradient(139.427576997557deg, rgba(101, 137, 242, 1) 0%, rgba(116, 177, 240, 1) 100%);
border: none;
border-radius: 20px;
box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.176470588235294);
flex-direction: column;
align-items: center;
padding: 20px 0;
z-index: 1;
margin-bottom: 80px;
display: flex;
.helper-box-text {
box-sizing: border-box;
font-size: 16px;
color: #ffffff;
text-align: center;
line-height: 28px;
margin-top: 20px;
}
}
.helper-QRcode-box {
box-sizing: border-box;
width: 240px;
height: 240px;
background-color: rgba(255, 255, 255, 1);
border-radius: 6px;
position: relative;
display: flex;
justify-content: center;
align-items: center;
.helper-QRcode-box-icon {
width: 24px;
height: 24px;
position: absolute;
}
.left-top {
top: 0;
left: 0;
transform: rotate(-90deg);
}
.left-bottom {
bottom: 0;
left: 0;
transform: rotate(180deg);
}
.right-top {
right: 0;
top: 0;
}
.right-bottom {
right: 0;
bottom: 0;
transform: rotate(90deg);
}
.helper-QRcode-img {
width: 220px;
height: 220px;
box-sizing: border-box;
}
}
.helper-bottom {
position: absolute;
bottom: 0;
left: 0;
width: 100vw;
height: 151px;
}
}
@media screen and (max-width: 600px) {
.helper-box {
width: 100vw;
padding-top: calc(59 / 600 * 100vw);
border-radius: calc(20 / 600 * 100vw);
border-bottom-right-radius: 0px;
border-bottom-left-radius: 0px;
box-shadow: 0px 0px calc(15 / 600 * 100vw) rgba(0, 0, 0, 0.101960784313725);
.cross-grey {
width: calc(16 / 600 * 100vw);
height: calc(16 / 600 * 100vw);
top: calc(13 / 600 * 100vw);
right: calc(13 / 600 * 100vw);
padding: calc(7 / 600 * 100vw);
}
.helper-text {
height: calc(103 / 600 * 100vw);
margin: 0 auto calc(24 / 600 * 100vw);
}
.helper-box-box {
width: calc(280 / 600 * 100vw);
border-radius: calc(20 / 600 * 100vw);
box-shadow: 0px 0px calc(15 / 600 * 100vw) rgba(0, 0, 0, 0.176470588235294);
padding: calc(20 / 600 * 100vw) 0;
margin-bottom: calc(80 / 600 * 100vw);
.helper-box-text {
font-size: calc(16 / 600 * 100vw);
line-height: calc(28 / 600 * 100vw);
margin-top: calc(20 / 600 * 100vw);
}
}
.helper-QRcode-box {
width: calc(240 / 600 * 100vw);
height: calc(240 / 600 * 100vw);
border-radius: calc(6 / 600 * 100vw);
.helper-QRcode-box-icon {
width: calc(24 / 600 * 100vw);
height: calc(24 / 600 * 100vw);
}
.helper-QRcode-img {
width: calc(220 / 600 * 100vw);
height: calc(220 / 600 * 100vw);
}
}
.helper-bottom {
height: calc(151 / 600 * 100vw);
}
}
}
}
@keyframes slideUp {
0% {
top: 100%;
}
100% {
top: 0;
}
}

View File

@@ -7,7 +7,6 @@
}
#search-tag .label-title .icon {
width: 25px;
height: 20px;
margin-right: 12px;
}
#search-tag .label-title .text {
@@ -65,6 +64,63 @@
color: #000000;
margin: 0 10px;
}
#search-tag .quantity .sort-area {
margin-left: auto;
position: relative;
z-index: 1;
}
#search-tag .quantity .sort-area .sort-head {
cursor: pointer;
}
#search-tag .quantity .sort-area .sort-head .text {
font-size: 14px;
color: #555555;
line-height: 26px;
margin-right: 6px;
}
#search-tag .quantity .sort-area .sort-head .icon {
width: 8px;
height: 5px;
transform: rotate(0deg);
transition: transform 0.3s ease-in-out;
}
#search-tag .quantity .sort-area .sort-head .icon.rotate {
transform: rotate(180deg);
}
#search-tag .quantity .sort-area .sort-mask {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
}
#search-tag .quantity .sort-area .sort-box {
position: absolute;
top: 28px;
right: 0;
width: 140px;
padding: 0 10px;
background-color: #ffffff;
border-radius: 8px;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.16862745);
}
#search-tag .quantity .sort-area .sort-box .item {
font-size: 16px;
color: #555555;
text-align: center;
height: 60px;
line-height: 60px;
cursor: pointer;
}
#search-tag .quantity .sort-area .sort-box .item.pitch {
font-family: "PingFangSC-Semibold", "PingFang SC Semibold", "PingFang SC", sans-serif;
font-weight: 650;
font-style: normal;
color: #d35110;
}
#search-tag .quantity .sort-area .sort-box .item:not(:last-child) {
border-bottom: 1px dotted #d7d7d7;
}
#search-tag .matter {
align-items: flex-start;
}
@@ -131,3 +187,31 @@
right: calc((100% - 1200px) / 2);
bottom: 10px;
}
#search-tag .matter .sidebar-box .recommend-and-essence {
width: 291px;
height: 64px;
background-color: #ffffff;
border: 1px solid #e9eef2;
border-radius: 10px;
padding: 0 10px;
justify-content: space-between;
margin-bottom: 12px;
}
#search-tag .matter .sidebar-box .recommend-and-essence .item {
width: 130px;
height: 40px;
background-color: #f6f6f6;
border: 1px solid #f2f2f2;
border-radius: 65px;
font-family: "PingFangSC-Semibold", "PingFang SC Semibold", "PingFang SC", sans-serif;
font-weight: 650;
font-style: normal;
font-size: 16px;
color: #000000;
cursor: pointer;
}
#search-tag .matter .sidebar-box .recommend-and-essence .item .icon {
width: 20px;
height: 24px;
margin-right: 8px;
}

View File

@@ -7,7 +7,7 @@
.icon {
width: 25px;
height: 20px;
// height: 20px;
margin-right: 12px;
}
@@ -74,6 +74,74 @@
color: #000000;
margin: 0 10px;
}
.sort-area {
margin-left: auto;
position: relative;
z-index: 1;
.sort-head {
cursor: pointer;
.text {
font-size: 14px;
color: #555555;
line-height: 26px;
margin-right: 6px;
}
.icon {
width: 8px;
height: 5px;
transform: rotate(0deg);
transition: transform 0.3s ease-in-out;
&.rotate {
transform: rotate(180deg);
}
}
}
.sort-mask {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
}
.sort-box {
position: absolute;
top: 28px;
right: 0;
width: 140px;
padding: 0 10px;
background-color: rgba(255, 255, 255, 1);
border-radius: 8px;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.168627450980392);
.item {
font-size: 16px;
color: #555555;
text-align: center;
height: 60px;
line-height: 60px;
cursor: pointer;
&.pitch {
font-family: "PingFangSC-Semibold", "PingFang SC Semibold", "PingFang SC", sans-serif;
font-weight: 650;
font-style: normal;
color: #d35110;
}
&:not(:last-child) {
border-bottom: 1px dotted #d7d7d7;
}
}
}
}
}
.matter {
@@ -154,6 +222,37 @@
right: calc((100% - 1200px) / 2);
bottom: 10px;
}
.recommend-and-essence {
width: 291px;
height: 64px;
background-color: rgba(255, 255, 255, 1);
border: 1px solid rgba(233, 238, 242, 1);
border-radius: 10px;
padding: 0 10px;
justify-content: space-between;
margin-bottom: 12px;
.item {
width: 130px;
height: 40px;
background-color: rgba(246, 246, 246, 1);
border: 1px solid rgba(242, 242, 242, 1);
border-radius: 65px;
font-family: "PingFangSC-Semibold", "PingFang SC Semibold", "PingFang SC", sans-serif;
font-weight: 650;
font-style: normal;
font-size: 16px;
color: #000000;
cursor: pointer;
.icon {
width: 20px;
height: 24px;
margin-right: 8px;
}
}
}
}
}
}

View File

@@ -15,6 +15,7 @@
border: none;
outline: none;
height: 100%;
font-size: 16px;
}
#search .search-box .search-icon {
width: 20px;
@@ -126,3 +127,46 @@
width: 291px;
position: sticky;
}
#search .matter .sidebar-box .recommend-and-essence {
width: 291px;
height: 64px;
background-color: #ffffff;
border: 1px solid #e9eef2;
border-radius: 10px;
padding: 0 10px;
justify-content: space-between;
margin-bottom: 12px;
}
#search .matter .sidebar-box .recommend-and-essence .item {
width: 130px;
height: 40px;
background-color: #f6f6f6;
border: 1px solid #f2f2f2;
border-radius: 65px;
font-family: "PingFangSC-Semibold", "PingFang SC Semibold", "PingFang SC", sans-serif;
font-weight: 650;
font-style: normal;
font-size: 16px;
color: #000000;
cursor: pointer;
}
#search .matter .sidebar-box .recommend-and-essence .item .icon {
width: 20px;
height: 24px;
margin-right: 8px;
}
#search .search-no .earth-icon {
width: 239px;
height: 180px;
margin: 0 auto;
}
#search .search-no .input-box {
width: 903px;
height: 60px;
background-color: #ffffff;
border: 1px solid #e9eef2;
border-radius: 6px;
}
#search .search-no .input-box .input {
font-size: 16px;
}

View File

@@ -15,6 +15,7 @@
border: none;
outline: none;
height: 100%;
font-size: 16px;
}
.search-icon {
@@ -161,6 +162,58 @@
// left: calc((100% - 1200px) / 2 + 909px);
// bottom: 10px;
// }
.recommend-and-essence {
width: 291px;
height: 64px;
background-color: rgba(255, 255, 255, 1);
border: 1px solid rgba(233, 238, 242, 1);
border-radius: 10px;
padding: 0 10px;
justify-content: space-between;
margin-bottom: 12px;
.item {
width: 130px;
height: 40px;
background-color: rgba(246, 246, 246, 1);
border: 1px solid rgba(242, 242, 242, 1);
border-radius: 65px;
font-family: "PingFangSC-Semibold", "PingFang SC Semibold", "PingFang SC", sans-serif;
font-weight: 650;
font-style: normal;
font-size: 16px;
color: #000000;
cursor: pointer;
.icon {
width: 20px;
height: 24px;
margin-right: 8px;
}
}
}
}
}
.search-no {
.earth-icon {
width: 239px;
height: 180px;
margin: 0 auto;
}
.input-box {
width: 903px;
height: 60px;
background-color: rgba(255, 255, 255, 1);
border: 1px solid rgba(233, 238, 242, 1);
border-radius: 6px;
.input {
font-size: 16px;
}
}
}
}

View File

@@ -399,4 +399,30 @@
#sectionIndex .matter .sidebar {
display: none;
}
#sectionIndex .matter .matter-content .details-box .content-box .selectives-box .list {
padding-right: 0;
}
#sectionIndex .matter .matter-content .details-box .content-box .selectives-box .list .item {
width: 100%;
}
#sectionIndex .matter .matter-content .details-box .content-box .selectives-box .list .item .text {
flex: 1;
}
#sectionIndex .matter .matter-content .info-box .right .link .item {
width: 50%;
}
#sectionIndex .matter .matter-content .info-box .right .link .item:not(:last-child) {
margin: 0;
}
}
@media screen and (max-width: 500px) {
#sectionIndex .matter .matter-content .info-box {
padding-top: 15px;
padding-left: 15px;
}
#sectionIndex .matter .matter-content .info-box .img-box {
width: 70px;
height: 70px;
margin-right: 15px;
}
}

View File

@@ -83,6 +83,8 @@
}
.matter-content {
min-width: 0;
.info-box {
width: 100%;
background: -webkit-linear-gradient(270.539085289936deg, rgba(255, 255, 255, 1) 2%, rgba(235, 248, 249, 1) 98%);
@@ -234,6 +236,7 @@
margin-right: 12px;
position: sticky;
z-index: 1;
min-width: 0;
.selectives-box {
width: 100%;
@@ -473,4 +476,38 @@
#sectionIndex .matter .sidebar {
display: none;
}
#sectionIndex .matter .matter-content {
.details-box .content-box .selectives-box .list {
padding-right: 0;
.item {
width: 100%;
.text {
flex: 1;
}
}
}
.info-box .right .link .item {
width: 50%;
&:not(:last-child) {
margin: 0;
}
}
}
}
@media screen and (max-width: 500px) {
#sectionIndex .matter .matter-content .info-box {
padding-top: 15px;
padding-left: 15px;
.img-box {
width: 70px;
height: 70px;
margin-right: 15px;
}
}
}

BIN
img/apply-for-name.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

BIN
img/cross-grey.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
img/earth-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

BIN
img/essence-head-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
img/group-arrows.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

11
img/group-bj.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 287 KiB

BIN
img/group-bottom.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
img/group-title.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
img/group-top.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="500px" height="151px" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1 0 0 1 -780 -1161 )">
<path d="M 0 151 L 0 0 C 0 0 110.916965217331 54.7610464341339 252 54.578313253012 C 390.916397535917 54.3983863378389 500 0 500 0 L 500 151 L 0 151 Z " fill-rule="nonzero" fill="#edf4ff" stroke="none" transform="matrix(1 0 0 1 780 1161 )" />
</g>
</svg>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="500px" height="155px" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1 0 0 1 -780 -1157 )">
<path d="M 0 155 L 0 0 C 0 0 110.916965217331 43.139381024107 252 42.9518072289157 C 390.916397535917 42.7671140378439 500 0 500 0 L 500 155 L 0 155 Z " fill-rule="nonzero" fill="#fddf6d" stroke="none" transform="matrix(1 0 0 1 780 1157 )" />
</g>
</svg>

BIN
img/recommend-head-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

6
img/triangle-black.svg Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="8px" height="5px" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1 0 0 1 -1087 -552 )">
<path d="M 7.8515625 0.164930555555556 C 7.95052083333333 0.274884259259259 8 0.405092592592591 8 0.555555555555556 C 8 0.706018518518518 7.95052083333333 0.836226851851851 7.8515625 0.946180555555556 L 4.3515625 4.83506944444444 C 4.25260416666667 4.94502314814815 4.13541666666667 5 4 5 C 3.86458333333333 5 3.74739583333333 4.94502314814815 3.6484375 4.83506944444444 L 0.1484375 0.946180555555556 C 0.0494791666666667 0.836226851851851 0 0.706018518518518 0 0.555555555555556 C 0 0.405092592592591 0.0494791666666667 0.274884259259259 0.1484375 0.164930555555556 C 0.247395833333333 0.0549768518518512 0.364583333333333 0 0.5 0 L 7.5 0 C 7.63541666666667 0 7.75260416666667 0.0549768518518512 7.8515625 0.164930555555556 Z " fill-rule="nonzero" fill="#000000" stroke="none" transform="matrix(1 0 0 1 1087 552 )" />
</g>
</svg>

6
img/yellow-border.svg Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="24px" height="24px" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1 0 0 1 -1126 -924 )">
<path d="M 24 5.85365853658537 L 24 24 C 24 10.56 13.6914285714286 0 0.568479573639317 0 L 18.2857142857143 0 C 21.4857142857142 0 24 2.57560975609761 24 5.85365853658537 Z " fill-rule="nonzero" fill="#fddf6d" stroke="none" transform="matrix(1 0 0 1 1126 924 )" />
</g>
</svg>

View File

@@ -41,6 +41,10 @@ const watchList = {
// 监听 bi.txt同步到 bi.js
"../component/bi/bi.txt": "../component/bi/bi.js",
"../component/huddle-box/huddle-box.txt": "../component/huddle-box/huddle-box.js",
"../component/helper-pop/helper-pop.txt": "../component/helper-pop/helper-pop.js",
// 可添加更多文件(格式:'txt路径': 'js路径'
// './component/other/other.txt': './component/other/other.js',
};

View File

@@ -1,307 +1,295 @@
const { createApp, ref, onMounted, nextTick, onUnmounted, computed, watch, provide } = Vue;
import { itemForum } from "../component/item-forum/item-forum.js";
import { itemOffer } from "../component/item-offer/item-offer.js";
import { itemSummary } from "../component/item-summary/item-summary.js";
import { itemVote } from "../component/item-vote/item-vote.js";
import { itemMj } from "../component/item-mj/item-mj.js";
import { itemTenement } from "../component/item-tenement/item-tenement.js";
import { itemProject } from "../component/item-project/item-project.js";
import { headTop } from "../component/head-top/head-top.js";
import { hotTag } from "../component/hot-tag/hot-tag.js";
import { hotSearch } from "../component/hot-search/hot-search.js";
import { slideshowBox } from "../component/slideshow-box/slideshow-box.js";
import { latestList } from "../component/latest-list/latest-list.js";
import { loadBox } from "../component/load-box/load-box.js";
(async function () {
const { itemForum } = await import(withVer("../component/item-forum/item-forum.js"));
const { itemOffer } = await import(withVer("../component/item-offer/item-offer.js"));
const { itemSummary } = await import(withVer("../component/item-summary/item-summary.js"));
const { itemVote } = await import(withVer("../component/item-vote/item-vote.js"));
const { itemMj } = await import(withVer("../component/item-mj/item-mj.js"));
const { itemTenement } = await import(withVer("../component/item-tenement/item-tenement.js"));
const { itemProject } = await import(withVer("../component/item-project/item-project.js"));
const { headTop } = await import(withVer("../component/head-top/head-top.js"));
const { hotTag } = await import(withVer("../component/hot-tag/hot-tag.js"));
const { hotSearch } = await import(withVer("../component/hot-search/hot-search.js"));
const { slideshowBox } = await import(withVer("../component/slideshow-box/slideshow-box.js"));
const { latestList } = await import(withVer("../component/latest-list/latest-list.js"));
const { loadBox } = await import(withVer("../component/load-box/load-box.js"));
const appSearch = createApp({
setup() {
let kwValue = ref(null);
let typeValue = ref(null);
let kw = ref("");
onMounted(() => {
const params = getUrlParams();
console.log("params", params);
// kw.value = params.kw || "";
// const urlObj = new URL(location.href);
// const pathParts = urlObj.pathname.split("/").filter((part) => part);
// kw.value = decodeURIComponent(pathParts.pop());
kw.value = kwValue.value.innerText;
const tab = typeValue.value.innerText;
if (tab) tabValue.value = tab;
if (params.page) page.value = params.page;
else page.value = 1;
const appSearch = createApp({
setup() {
let kwValue = ref(null);
let typeValue = ref(null);
let kw = ref("");
onMounted(() => {
console.log('onMounted');
const params = getUrlParams();
if (kw.value) getList();
else page.value = null;
kw.value = kwValue.value.innerText;
const tab = typeValue.value.innerText;
if (tab) tabValue.value = tab;
if (params.page) page.value = params.page;
else page.value = 1;
getUserInfoWin();
window.addEventListener("scroll", handleScroll);
});
let isLogin = ref(false);
let realname = ref(0); // 是否已经实名
let userInfoWin = ref({});
let permissions = ref([]);
const getUserInfoWin = () => {
const checkUser = () => {
const user = window.userInfoWin;
if (!user) return;
document.removeEventListener("getUser", checkUser);
realname.value = user.realname;
userInfoWin.value = user;
if (user?.uin > 0 || user?.uid > 0) isLogin.value = true;
permissions.value = user?.authority || [];
};
document.addEventListener("getUser", checkUser);
};
const openAttest = () => {
const handleAttestClose = () => {
document.removeEventListener("closeAttest", handleAttestClose);
realname.value = window.userInfoWin?.realname || 0;
};
// 启动认证流程时添加监听
document.addEventListener("closeAttest", handleAttestClose);
loadAttest(2);
};
// 跳转登录
const goLogin = () => {
if (typeof window === "undefined") return;
if (window["userInfoWin"] && Object.keys(window["userInfoWin"]).length !== 0) {
if (window["userInfoWin"]["uid"]) isLogin.value = true;
else ajax_login();
} else ajax_login();
};
provide("isLogin", isLogin);
provide("userInfoWin", userInfoWin);
provide("realname", realname);
provide("openAttest", openAttest);
provide("goLogin", goLogin);
const cutTab = (type) => {
if (tabValue.value == type) return;
page.value = 1;
list.value = [];
count.value = 0;
tabValue.value = type;
pagination.value = [];
updateUrlParams({ type: type == "all" ? null : type });
getList();
};
let tabList = ref({
all: "全部",
thread: "论坛",
offer: "Offer",
offer_summary: "总结",
interviewexperience: "面经",
vote: "投票",
});
let tabValue = ref("all");
let uniqid = "";
const init = () => {
ajaxGet(`https://offer.gter.net/miniprogramApi/offer/search`).then((res) => {
if (res.code != 200) {
creationAlertBox("error", res.message);
page.value = 0;
return;
console.log("kw.value", kw.value);
if (kw.value) getList();
else {
page.value = null;
isEmptySearch.value = true;
}
console.log("res", res);
});
};
let loading = ref(false);
let page = ref(0);
let maxPage = ref(0);
let count = ref(0);
let list = ref([]);
let pagination = ref([]);
const getList = () => {
if (loading.value || page.value == null) return;
loading.value = true;
const limit = 20;
window.scrollTo(0, 0);
updateUrlParams({ page: page.value });
ajaxGet(`/v2/api/forum/topicLists?type=${tabValue.value == "all" ? "" : tabValue.value}&page=${page.value}&limit=${limit}&keyword=${kw.value}`)
.then((res) => {
getUserInfoWin();
window.addEventListener("scroll", handleScroll);
const preLoader = document.getElementById("pre-loader");
if (preLoader) preLoader.style.display = "none";
});
let isLogin = ref(false);
let realname = ref(0); // 是否已经实名
let userInfoWin = ref({});
let permissions = ref([]);
const getUserInfoWin = () => {
const checkUser = () => {
const user = window.userInfoWin;
if (!user) return;
document.removeEventListener("getUser", checkUser);
realname.value = user.realname;
userInfoWin.value = user;
if (user?.uin > 0 || user?.uid > 0) isLogin.value = true;
permissions.value = user?.authority || [];
};
document.addEventListener("getUser", checkUser);
};
const openAttest = () => {
const handleAttestClose = () => {
document.removeEventListener("closeAttest", handleAttestClose);
realname.value = window.userInfoWin?.realname || 0;
};
// 启动认证流程时添加监听
document.addEventListener("closeAttest", handleAttestClose);
loadAttest(2);
};
// 跳转登录
const goLogin = () => {
if (typeof window === "undefined") return;
if (window["userInfoWin"] && Object.keys(window["userInfoWin"]).length !== 0) {
if (window["userInfoWin"]["uid"]) isLogin.value = true;
else ajax_login();
} else ajax_login();
};
provide("isLogin", isLogin);
provide("userInfoWin", userInfoWin);
provide("realname", realname);
provide("openAttest", openAttest);
provide("goLogin", goLogin);
const cutTab = (type) => {
if (tabValue.value == type) return;
page.value = 1;
list.value = [];
count.value = 0;
tabValue.value = type;
pagination.value = [];
updateUrlParams({ type: type == "all" ? null : type });
getList();
};
let tabList = ref({
all: "全部",
thread: "论坛",
offer: "Offer",
offer_summary: "总结",
interviewexperience: "面经",
vote: "投票",
xg: "港校项目",
});
let tabValue = ref("all");
let uniqid = "";
const init = () => {
ajaxGet(`https://offer.gter.net/miniprogramApi/offer/search`).then((res) => {
if (res.code != 200) {
creationAlertBox("error", res.message);
page.value = 0;
return;
}
let data = res.data;
data.data.unshift({
id: 20,
program_en: "Master of Laws in Arbitration and Dispute Resolution",
program_zh: "法学硕士(仲裁及争议解决学)",
program_abbr: "LLMARBDR",
program_code: "P41",
award_en: "Master of Laws in Arbitration and Dispute Resolution",
award_zh: "法学硕士(仲裁及争议解决学)",
subject_area_id: 9,
subject_area_name: "Law",
primary_university: "City University of Hong Kong",
primary_university_id: 3,
status: "ACTIVE",
intake_year: 2026,
disciplineid: 9,
distinctive: "毕业生可参与:当事人、辩护人、专家、仲裁员和调解员",
rank: "42",
department: "法律学院",
admissionsproject: "1",
departmentid: 26,
schoolalias: "城大",
schoolname: "香港城市大学",
tags: ["有奖学金", "论文课程", "26fall 提前批", "Top 50", "专业资格认证"],
schoolenname: "City University of Hong Kong",
intake_month: 9,
schoolid: 311,
tuition_fee: null,
uniqid: "tf1yFYMER8-1bY1t5oLbKaNc2FVhOWM0",
type: "programs",
schoollogo: "https://oss.x-php.com/school/J6BSwE-VfCFkCb1SBaR7ec6NYmTA4pRcOalNHJRfNzUxNg~~",
});
list.value = data.data;
if (list.value.length == 0) page.value = null;
count.value = data.count;
loading.value = false;
maxPage.value = Math.ceil(count.value / limit);
pagination.value = calculatePagination(page.value, maxPage.value);
let url = `/search/${kw.value}`;
const hostname = location.hostname;
const localHostReg = /^(localhost|127\.0\.0\.1|\[::1\])$/;
if (localHostReg.test(hostname)) url = `/search.html`;
updateUrlLastPath(url);
removeQueryQ();
})
.catch((err) => {
err = err.data;
if (err.code == 401) goLogin();
loading.value = false;
});
};
};
const calculatePagination = (currentPage, totalPages, visibleCount = 3) => {
// 处理特殊情况总页数小于等于1时无需显示分页
if (totalPages <= 1) {
return [];
}
let loading = ref(false);
let page = ref(0);
let maxPage = ref(0);
let count = ref(0);
let total = ref(0);
let list = ref([]);
let pagination = ref([]);
const getList = () => {
if (loading.value || page.value == null) return;
loading.value = true;
isEmptySearch.value = false;
const limit = 20;
window.scrollTo(0, 0);
// updateUrlParams({ page: page.value });
const pages = [];
// 始终显示第一页
pages.push(1);
let postHead = null;
// 计算中间需要显示的页码范围
let startPage = Math.max(2, currentPage - Math.floor(visibleCount / 2));
let endPage = Math.min(totalPages - 1, startPage + visibleCount - 1);
if (tabValue.value == "xg") {
postHead = ajax(`https://api.gter.net/v1/program/getList`, {
page: page.value,
keyword: kw.value,
});
} else postHead = ajaxGet(`/v2/api/forum/topicLists?type=${tabValue.value == "all" ? "" : tabValue.value}&page=${page.value}&limit=${limit}&keyword=${kw.value}`);
// 调整起始页码,确保显示足够数量的页码
startPage = Math.max(2, endPage - visibleCount + 1);
let historySearchList = JSON.parse(localStorage.getItem("history-search")) || [];
historySearchList.unshift(kw.value);
historySearchList = [...new Set(historySearchList)];
if (historySearchList.length > 10) historySearchList = historySearchList.splice(0, 10);
localStorage.setItem("history-search", JSON.stringify(historySearchList));
// 前面的省略号:如果第一页和起始页之间有间隔
if (startPage > 2) {
pages.push("...");
}
postHead
.then((res) => {
if (res.code != 200) {
creationAlertBox("error", res.message);
return;
}
// 添加中间的页码
for (let i = startPage; i <= endPage; i++) {
pages.push(i);
}
let data = res.data;
list.value = data.data;
if (list.value.length == 0) page.value = null;
// 后面的省略号:如果最后一页和结束页之间有间隔
if (endPage < totalPages - 1) {
pages.push("...");
}
total.value = data.total || data.count;
count.value = data.count;
loading.value = false;
maxPage.value = Math.ceil(count.value / limit);
pagination.value = calculatePagination(page.value, maxPage.value);
// updateUrlLastPath(`/search/${kw.value}`);
removeQueryQ();
})
.catch((err) => {
err = err?.data;
if (err?.code == 401) goLogin();
loading.value = false;
});
};
// 始终显示最后一页如果总页数大于1
if (totalPages > 1) {
pages.push(totalPages);
}
const calculatePagination = (currentPage, totalPages, visibleCount = 3) => {
// 处理特殊情况总页数小于等于1时无需显示分页
if (totalPages <= 1) {
return [];
}
return pages;
};
const pages = [];
// 始终显示第一页
pages.push(1);
const cutPage = (value) => {
if (value == "...") return;
if (value == page.value) return;
page.value = value;
list.value = [];
getList();
};
// 计算中间需要显示的页码范围
let startPage = Math.max(2, currentPage - Math.floor(visibleCount / 2));
let endPage = Math.min(totalPages - 1, startPage + visibleCount - 1);
const prevPage = () => {
page.value -= 1;
list.value = [];
pagination.value = [];
getList();
};
// 调整起始页码,确保显示足够数量的页码
startPage = Math.max(2, endPage - visibleCount + 1);
const nextPage = () => {
page.value += 1;
list.value = [];
pagination.value = [];
getList();
};
// 前面的省略号:如果第一页和起始页之间有间隔
if (startPage > 2) {
pages.push("...");
}
const startSearch = () => {
if (kw.value == "") {
creationAlertBox("error", "请输入搜索关键词");
return;
}
// 添加中间的页码
for (let i = startPage; i <= endPage; i++) {
pages.push(i);
}
page.value = 1;
list.value = [];
count.value = 0;
pagination.value = [];
getList();
};
// 后面的省略号:如果最后一页和结束页之间有间隔
if (endPage < totalPages - 1) {
pages.push("...");
}
const sidebarFixed = ref(false);
const matterFixed = ref(false);
const matterBottom = ref(false);
// 始终显示最后一页如果总页数大于1
if (totalPages > 1) {
pages.push(totalPages);
}
const handleScroll = () => {
matterHeight.value = -(matterContentRef.value.offsetHeight - window.innerHeight);
sidebarHeight.value = -(sidebarRef.value.offsetHeight - window.innerHeight);
if (matterHeight.value > 0) matterHeight.value = 12;
if (sidebarHeight.value > 0) sidebarHeight.value = 12;
};
return pages;
};
const matterRef = ref(null);
const sidebarRef = ref(null);
const matterContentRef = ref(null);
const cutPage = (value) => {
if (value == "...") return;
if (value == page.value) return;
page.value = value;
list.value = [];
getList();
};
let sidebarHeight = ref(0);
let matterHeight = ref(0);
const prevPage = () => {
page.value -= 1;
list.value = [];
pagination.value = [];
getList();
};
return { matterHeight, sidebarHeight, matterBottom, matterFixed, matterContentRef, sidebarFixed, matterRef, sidebarRef, loading, typeValue, kwValue, startSearch, kw, maxPage, prevPage, nextPage, tabValue, cutTab, tabList, count, list, page, pagination, cutPage };
},
});
appSearch.component("item-forum", itemForum);
appSearch.component("itemOffer", itemOffer);
appSearch.component("itemSummary", itemSummary);
appSearch.component("itemVote", itemVote);
appSearch.component("itemMj", itemMj);
appSearch.component("itemTenement", itemTenement);
appSearch.component("itemProject", itemProject);
appSearch.component("head-top", headTop);
appSearch.component("hot-tag", hotTag);
appSearch.component("hot-search", hotSearch);
appSearch.component("slideshow-box", slideshowBox);
appSearch.component("latest-list", latestList);
appSearch.component("load-box", loadBox);
appSearch.mount("#search");
const nextPage = () => {
page.value += 1;
list.value = [];
pagination.value = [];
getList();
};
const startSearch = () => {
if (kw.value == "") {
creationAlertBox("error", "请输入搜索关键词");
return;
}
page.value = 1;
list.value = [];
count.value = 0;
pagination.value = [];
getList();
};
const sidebarFixed = ref(false);
const matterFixed = ref(false);
const matterBottom = ref(false);
const handleScroll = () => {
matterHeight.value = -(matterContentRef.value.offsetHeight - window.innerHeight);
sidebarHeight.value = -(sidebarRef.value.offsetHeight - window.innerHeight);
if (matterHeight.value > 0) matterHeight.value = 12;
if (sidebarHeight.value > 0) sidebarHeight.value = 12;
};
const matterRef = ref(null);
const sidebarRef = ref(null);
const matterContentRef = ref(null);
let sidebarHeight = ref(0);
let matterHeight = ref(0);
let isEmptySearch = ref(false);
return { isEmptySearch, total, matterHeight, sidebarHeight, matterBottom, matterFixed, matterContentRef, sidebarFixed, matterRef, sidebarRef, loading, typeValue, kwValue, startSearch, kw, maxPage, prevPage, nextPage, tabValue, cutTab, tabList, count, list, page, pagination, cutPage };
},
});
appSearch.component("item-forum", itemForum);
appSearch.component("itemOffer", itemOffer);
appSearch.component("itemSummary", itemSummary);
appSearch.component("itemVote", itemVote);
appSearch.component("itemMj", itemMj);
appSearch.component("itemTenement", itemTenement);
appSearch.component("itemProject", itemProject);
appSearch.component("head-top", headTop);
appSearch.component("hot-tag", hotTag);
appSearch.component("hot-search", hotSearch);
appSearch.component("slideshow-box", slideshowBox);
appSearch.component("latest-list", latestList);
appSearch.component("load-box", loadBox);
appSearch.mount("#search");
})();

333
js/sectionV2.js Normal file
View File

@@ -0,0 +1,333 @@
const { createApp, ref, onMounted, nextTick, onUnmounted, computed, watch, provide } = Vue;
(async function () {
const { itemForum } = await import(withVer("../component/item-forum/item-forum.js"));
const { itemOffer } = await import(withVer("../component/item-offer/item-offer.js"));
const { itemSummary } = await import(withVer("../component/item-summary/item-summary.js"));
const { itemVote } = await import(withVer("../component/item-vote/item-vote.js"));
const { itemMj } = await import(withVer("../component/item-mj/item-mj.js"));
const { itemTenement } = await import(withVer("../component/item-tenement/item-tenement.js"));
const { itemProject } = await import(withVer("../component/item-project/item-project.js"));
const { latestList } = await import(withVer("../component/latest-list/latest-list.js"));
const { headTop } = await import(withVer("../component/head-top/head-top.js"));
const { loadBox } = await import(withVer("../component/load-box/load-box.js"));
const { huddleBox } = await import(withVer("../component/huddle-box/huddle-box.js"));
const { helperPop } = await import(withVer("../component/helper-pop/helper-pop.js"));
const appSectionIndex = createApp({
setup() {
let uniValue = ref(null);
let isMobile = ref(false);
onMounted(() => {
isMobile.value = window.isMobile;
const urlObj = new URL(location.href);
const pathParts = urlObj.pathname.split("/").filter((part) => part);
const id = pathParts.pop();
section.value = uniValue.value.innerText;
init();
getSectionList();
handpick();
getTags();
getList();
getTopicLatest();
window.addEventListener("scroll", handleScroll);
// const preLoader = document.getElementById("pre-loader");
// if (preLoader) preLoader.style.display = "none";
document.querySelectorAll(".vuehide").forEach((item) => {
item.style.display = "none";
});
});
const detailsRef = ref(null);
const matterRef = ref(null);
const sidebarRef = ref(null);
const contentRef = ref(null);
let sidebarHeight = ref(0);
let matterHeight = ref(0);
const sidebarFixed = ref(false);
const handleScroll = () => {
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
const scrollHeight = document.documentElement.scrollHeight;
const clientHeight = window.innerHeight;
// 列表下 滑动到底部 获取新数据
if (scrollTop + clientHeight >= scrollHeight - 200) getList();
// 侧边栏滚动固定
// if (scrollTop >= detailsRef.value.offsetTop + sidebarRef.value.offsetHeight - clientHeight) sidebarFixed.value = true;
// else sidebarFixed.value = false;
matterHeight.value = -(contentRef.value.offsetHeight - window.innerHeight);
sidebarHeight.value = -(sidebarRef.value.offsetHeight - window.innerHeight);
if (matterHeight.value > 0) matterHeight.value = 12;
if (sidebarHeight.value > 0) sidebarHeight.value = 12;
};
let sectionList = ref([]);
let section = ref("");
const getSectionList = () => {
ajaxGet("/v2/api/forum/getSectionList").then((res) => {
if (res.code != 200) return;
const data = res.data || [];
let obj = {};
data.forEach((element) => (obj[element.cid] = element));
const list = insertLineBetweenCategories(data, "cid");
sectionList.value = list;
// if (!section.value) {
// const uniqid = list[0].uniqid;
// section.value = uniqid;
// updateUrlParams({ section: uniqid });
// init();
// }
});
};
// 将版块按 cid 分格开
const insertLineBetweenCategories = (arr) => {
if (!arr.length) return [];
const sortedArr = [...arr].sort((a, b) => {
if (a["cid"] < b["cid"]) return -1;
if (a["cid"] > b["cid"]) return 1;
return 0;
});
const result = [sortedArr[0]];
let prevCategory = sortedArr[0]["cid"];
for (let i = 1; i < sortedArr.length; i++) {
const current = sortedArr[i];
const currentCategory = current["cid"];
if (currentCategory !== prevCategory) {
result.push({
key: "line",
});
prevCategory = currentCategory;
}
result.push(current);
}
return result;
};
let info = ref({});
const init = () => {
ajaxGet(`/v2/api/forum/getSectionDetails?sectionid=${section.value}`).then((res) => {
if (res.code != 200) return;
const data = res.data || {};
info.value = data;
// 滚动到顶部
window.scrollTo({ top: 0, behavior: "smooth" });
});
};
let handpickList = ref([]);
const handpick = () => {
ajaxGet(`/v2/api/forum/topicHandpicked?sectionid=${section.value}`).then((res) => {
let data = res.data || [];
handpickList.value = data;
});
};
let tagsList = ref([]);
const getTags = () => {
ajaxGet(`/v2/api/forum/sectionTags?sectionid=${section.value}`).then((res) => {
if (res.code != 200) return;
const data = res.data || {};
tagsList.value = data;
});
};
let loading = ref(false);
let page = ref(1);
let count = ref(0);
let list = ref([]);
const getList = () => {
if (loading.value || page.value == 0) return;
loading.value = true;
ajaxGet(`/v2/api/forum/topicLists?page=${page.value || 1}&sectionid=${section.value}`)
.then((res) => {
if (res.code != 200) return;
let data = res.data;
list.value = list.value.concat(data.data);
page.value = data.count > data.limit * data.page ? page.value + 1 : 0;
count.value = data.count;
loading.value = false;
})
.catch((err) => {
err = err.data;
if (err.code == 401) openLoginBtnState();
loading.value = false;
});
};
onMounted(() => getUserInfoWin());
let isLogin = ref(false);
let realname = ref(0); // 是否已经实名
let userInfoWin = ref({});
const getUserInfoWin = () => {
const checkUser = () => {
const user = window.userInfoWin;
if (!user) return;
document.removeEventListener("getUser", checkUser);
realname.value = user.realname;
userInfoWin.value = user;
if (user?.uin > 0 || user?.uid > 0) isLogin.value = true;
};
document.addEventListener("getUser", checkUser);
};
const openAttest = () => {
const handleAttestClose = () => {
document.removeEventListener("closeAttest", handleAttestClose);
realname.value = window.userInfoWin?.realname || 0;
};
// 启动认证流程时添加监听
document.addEventListener("closeAttest", handleAttestClose);
loadAttest(2);
};
// 跳转登录
const goLogin = () => {
if (typeof window === "undefined") return;
if (window["userInfoWin"] && Object.keys(window["userInfoWin"]).length !== 0) {
if (window["userInfoWin"]["uid"]) isLogin.value = true;
else ajax_login();
} else ajax_login();
};
provide("isLogin", isLogin);
provide("userInfoWin", userInfoWin);
provide("realname", realname);
provide("openAttest", openAttest);
provide("goLogin", goLogin);
const changeSection = (uniqid) => {
section.value = uniqid;
handpickList.value = [];
info.value = {};
tagsList.value = [];
count.value = 0;
page.value = 1;
list.value = [];
init();
handpick();
getTags();
getList();
updateUrlLastPath(`/section/${uniqid}`);
};
let offer = ref([]); // 面经列表
let vote = ref([]); // 面经列表
let interviewexperience = ref([]); // 面经列表
const getTopicLatest = () => {
ajaxGet(`/v2/api/forum/getTopicLatest?limit=4`).then((res) => {
const data = res.data || [];
data.vote.forEach((item) => {
if (!item.title) {
item.title = item.content;
item.content = "";
}
});
offer.value = data.offer;
vote.value = data.vote;
interviewexperience.value = data.interviewexperience;
});
};
let linkXg = ref([
{
name: "申港超强资料包",
url: "https://u.gter.net/ad/1043?x=gter",
},
{
name: "港校项目库",
url: "http://program.gter.net/",
},
{
name: "26fall香港申请群",
img: "/img/cong-ge.png",
hint: "微信扫码添加",
type: "cong",
},
{
name: "寄托香港租房",
url: "https://fang.gter.net/",
},
]); // 链接列表
let linkOther = ref([
{
name: "26fall申请群",
img: "/img/cong-ge.png",
title: "26fall申请群",
hint: "微信扫码添加",
type: "cong",
},
{
name: "申请求助",
img: "/img/university-manager.png",
title: "申请遇疑问可联系",
hint: "寄托院校君",
type: "university",
},
]); // 链接列表
const handleCheckAttest = (e) => {
if (!isLogin.value) {
goLogin();
e.preventDefault(); // 阻止默认跳转(即使 href 为链接,也强制拦截)
return;
}
if (realname.value === 0 && userInfoWin.value?.uin > 0) {
openAttest();
e.preventDefault(); // 阻止默认跳转(即使 href 为链接,也强制拦截)
}
};
let huddleBoxRef = ref(null);
let helperPopRef = ref(null);
const linkClick = (type) => {
if (!isMobile.value) return;
if (type == "cong") huddleBoxRef.value.open();
if (type == "university") helperPopRef.value.open();
};
return { helperPopRef, huddleBoxRef, linkClick, handleCheckAttest, sidebarHeight, matterHeight, page, sidebarFixed, detailsRef, contentRef, matterRef, sidebarRef, loading, linkOther, linkXg, uniValue, offer, vote, interviewexperience, changeSection, sectionList, section, info, handpickList, tagsList, list, count };
},
});
appSectionIndex.component("item-forum", itemForum);
appSectionIndex.component("item-offer", itemOffer);
appSectionIndex.component("item-summary", itemSummary);
appSectionIndex.component("item-vote", itemVote);
appSectionIndex.component("item-mj", itemMj);
appSectionIndex.component("item-tenement", itemTenement);
appSectionIndex.component("item-project", itemProject);
appSectionIndex.component("latest-list", latestList);
appSectionIndex.component("head-top", headTop);
appSectionIndex.component("load-box", loadBox);
appSectionIndex.component("huddle-box", huddleBox);
appSectionIndex.component("helper-pop", helperPop);
appSectionIndex.mount("#sectionIndex");
})();

474
searchV2.html Normal file
View File

@@ -0,0 +1,474 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>搜索结果 - 澳门大学 - 寄托天下 -- 寄托天下</title>
<link rel="stylesheet" href="https://framework.x-php.com/gter/forum/css/public.css?v=vDmK98808ObK" />
<link rel="stylesheet" href="/css/search.css" />
<meta name="description" content="在寄托天下留学论坛上搜索澳门大学, 分享留学经验, 咨询签证, 面试, 机经, offer, 奖学金, 名校专业等。">
<meta name="keywords" content="澳门大学, 寄托天下, 留学论坛">
<meta name="author" content="">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:title" content="搜索结果 - 澳门大学 - 寄托天下">
<meta property="og:description" content="在寄托天下留学论坛上搜索澳门大学, 分享留学经验, 咨询签证, 面试, 机经, offer, 奖学金, 名校专业等。">
<meta property="og:image" content="">
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:title" content="搜索结果 - 澳门大学 - 寄托天下">
<meta property="twitter:description" content="在寄托天下留学论坛上搜索澳门大学, 分享留学经验, 咨询签证, 面试, 机经, offer, 奖学金, 名校专业等。">
<meta property="twitter:image" content="">
<!-- 网站图标 -->
<link rel="icon" href="https://www.gter.net/favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="https://www.gter.net/favicon.ico" type="image/x-icon">
<style>
[v-cloak] {
display: none !important;
}
#pre-loader {
height: 70vh;
display: flex;
justify-content: center;
align-items: center;
}
#pre-loader .three-bounce>div {
display: inline-block;
width: 18px;
height: 18px;
border-radius: 100%;
top: 50%;
margin-top: -9px;
background: #aeadba;
animation: bouncedelay 1.4s infinite ease-in-out;
animation-fill-mode: both;
}
#pre-loader .three-bounce .one {
animation-delay: -0.32s;
}
#pre-loader .three-bounce .two {
animation-delay: -0.16s;
}
@keyframes bouncedelay {
0%,
100%,
80% {
transform: scale(0);
-webkit-transform: scale(0);
}
40% {
transform: scale(1);
-webkit-transform: scale(1);
}
}
</style>
<script type="text/javascript">
var STYLEID = '2',
STATICURL = 'static/',
IMGDIR = 'https://bbs.gter.net/template/archy_plt8/image',
VERHASH = 'Z62',
charset = 'gbk',
discuz_uid = '0',
cookiepre = '4B5x_c0ae_',
cookiedomain = 'gter.net',
cookiepath = '/',
showusercard = '1',
attackevasive = '0',
disallowfloat = '',
creditnotice = ',',
defaultstyle = '',
REPORTURL = 'aHR0cDovL2Jicy5ndGVyLm5ldC9mb3J1bS5waHA/dGlkPTI0MDYzNTYmZ290bz1sYXN0cG9zdA==',
SITEURL = 'https://app.gter.net/',
JSPATH = 'static/js/';
</script>
<script src="https://app.gter.net/bottom?tpl=header&menukey=bbs"></script>
<script src="https://framework.x-php.com/gter/bbs/static/js/common.js" charset="gbk"></script>
</head>
<body>
<script>
window.__ASSET_VERSION__ = 'Z69';
// 判断是否是移动端
window.isMobile = window.innerWidth <= 768;
</script>
<div id="ajaxwaitid"></div>
<div id="append_parent"></div>
<div class="head-top flexacenter" style="width: 1200px;margin: 20px auto 30px;">
<a href="/" class="flexacenter" target="_blank">
<img class="logo" src="https://oss.gter.net/logo" alt="" />
</a>
<div class="flex1"></div>
<div class="input-box flexacenter">
<div class="placeholder">
<div class="placeholder-box" style="transition: transform .3s ease"></div>
</div>
<input class="input flex1" type="text" maxlength="140" /> <img class="icon" onclick="searchEvent()" src="https://framework.x-php.com/gter/forum/img/search-icon.svg?v=vDmK98808ObK" />
<div class="search-box-history">
<div class="search-box-history-title">历史搜索</div>
<div class="search-box-history-list"></div>
</div>
</div>
<div class="post-list flexacenter"> </div>
<div class="sign-in sign-in-no flexacenter"></div>
<div class="head-more flexcenter" onclick="openHeadPop()">
<img class="more-icon" style="width: 18px;height: 15px;" src="https://framework.x-php.com/gter/forum/img/threeAcross.svg?v=vDmK98808ObK" />
</div>
<div class="head-pop" style="display: none;">
<div class="head-more-pop">
<div class="head-more-userinfo flex1 flexacenter">
<div class="head-more-left flexacenter"><img class="head-more-userinfo-avatar" src="" alt="">
<div class="head-more-userinfo-username"></div>
</div>
<div class="head-more-right">
<div class="loginBtn flexcenter" onclick="go_ajax_Login()">登录/注册</div>
</div>
</div>
<div class="tab-list"><a class="tab-item flexacenter" href="https://www.gter.net" target="_blank">寄托首页</a><a class="tab-item flexacenter pitch" href="https://f.gter.net" target="_blank">论坛</a><a class="tab-item flexacenter" href="https://app.gter.net/admissionOfficer" target="_blank">招生官</a><a class="tab-item flexacenter" href="https://bbs.gter.net/thread-2345065-1-1.html" target="_blank">加群</a><a class="tab-item flexacenter" href="https://offer.gter.net" target="_blank">Offer榜</a></div>
<a class="head-more-post flexcenter" href="/publish" target="" onclick="skipLoginUrl(event)">
<div class="head-more-post-icon flexcenter"><img class="head-more-post-img" src="https://framework.x-php.com/gter/forum/img/addyellow.svg?v=vDmK98808ObK" /></div>发布帖子
</a>
<img class="cross-icon" onclick="crossHeadPop()" src="https://framework.x-php.com/gter/forum/img/cross.svg?v=vDmK98808ObK">
</div>
</div>
</div>
<div class="valueA" style="display: none;">https://framework.x-php.com/gter/forum/</div>
<div class="container" id="search">
<div class="templateValue" ref="kwValue">澳门大学</div>
<div class="templateValue" ref="typeValue"></div>
<template v-if="!isNoSearch">
<div class="search-no">
<img class="earth-icon flexflex" src="/img/earth-icon.png">
<div class="input-box">
<input class="flex1" placeholder="港中大 双学位">
<div class="btn">搜索</div>
</div>
</div>
</template>
<template v-else>
<div class="search-box flexacenter">
<input class="search-input flex1" placeholder="请输入搜索关键词" v-model="kw" @keyup.enter="startSearch" />
<img class="search-icon" src="https://framework.x-php.com/gter/forum/img/search-icon.svg?v=vDmK98808ObK" alt="" @click="startSearch" />
</div>
<template v-if="!isEmptySearch">
<div class="classify flexacenter">
<div class="item" :class="{'pitch': key == tabValue}" v-for="(item, key) in tabList" :key="key" @click="cutTab(key)">{{ item }}</div>
</div>
<div class="quantity flexacenter">
{{ tabList[tabValue] }}
<div class="line"></div>
<div class="num">{{ total }}</div>
</div>
</template>
<div id="pre-loader">
<div class="three-bounce" p-id="11">
<div class="one" p-id="12"></div>
<div class="two" p-id="13"></div>
<div class="three" p-id="14"></div>
</div>
</div>
<div class="matter flexflex" ref="matterRef" v-cloak>
<div class="matter-content flex1" ref="matterContentRef" :style="{'top': matterHeight + 'px'}">
<div class="list-box" v-if="list.length != 0">
<template v-for="(item,index) in list" :key="index">
<item-offer v-if=" item.type == 'offer'" :itemdata="item"></item-offer>
<item-summary v-else-if="item.type == 'offer_summary'" :itemdata="item"></item-summary>
<item-vote v-else-if="item.type == 'vote'" :itemdata="item"></item-vote>
<item-mj v-else-if="item.type == 'interviewexperience'" :itemdata="item"></item-mj>
<item-tenement v-else-if="item.type == 'tenement'" :itemdata="item"></item-tenement>
<item-project v-else-if="item.type == 'programs' || tabValue == 'xg'" :itemdata="item"></item-project>
<item-forum v-else :itemdata="item"></item-forum>
</template>
</div>
<load-box :loading="loading"></load-box>
<div v-if="list.length == 0 && page == null" class="empty flexcenter">
<img class="empty-icon" src="https://framework.x-php.com/gter/forum/img/empty-icon.png?v=vDmK98808ObK" />
<div class="empty-text">{{ kw ? '- 暂无内容 -' : '- 请输入搜索关键词 -' }}</div>
</div>
<div class="pages-box flexcenter" v-if="pagination.length != 0">
<img v-if="page == 1" class="arrows" src="https://framework.x-php.com/gter/forum/img/arrows-gray-simple.svg?v=vDmK98808ObK" alt="" />
<img @click="prevPage" v-else class="arrows rotate180" src="https://framework.x-php.com/gter/forum/img/arrows-gray-deep.svg?v=vDmK98808ObK" alt="" />
<div class="item" :class="{'pitch': item == page }" v-for="(item, index) in pagination" @click="cutPage(item)">{{ item }}</div>
<img v-if="page == maxPage" class="arrows rotate180" src="https://framework.x-php.com/gter/forum/img/arrows-gray-simple.svg?v=vDmK98808ObK" alt="" />
<img @click="nextPage" v-else v-else class="arrows" src="https://framework.x-php.com/gter/forum/img/arrows-gray-deep.svg?v=vDmK98808ObK" alt="" />
</div>
</div>
<div class="sidebar-box" ref="sidebarRef" :style="{'top': sidebarHeight + 'px'}">
<hot-search></hot-search>
<hot-tag></hot-tag>
<slideshow-box></slideshow-box>
<latest-list></latest-list>
</div>
</div>
</template>
</div>
<script src="https://framework.x-php.com/gter/forum/js/vue.global.js?v=vDmK98808ObK"></script>
<script src="https://framework.x-php.com/gter/forum/js/axios.min.js?v=vDmK98808ObK"></script>
<script src="https://framework.x-php.com/gter/forum/js/public.js?v=vDmK98808ObK"></script>
<!-- <script src="https://f.gter.net/js/public.js"></script> -->
<script type="module" src="/js/search.js?v=vDmK98808ObK"></script>
<!-- <script type="module" src="https://f.gter.net/js/search.js"></script> -->
<script src="https://app.gter.net/bottom?tpl=footer,popupnotification"></script>
<script>
console.log(location.href.indexOf('details') != -1);
if (location.href.indexOf('details') != -1) {
const postList = document.querySelector('.head-top .post-list')
postList.innerHTML = `<a href="/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="https://framework.x-php.com/gter/forum/img/post-thread.png?v=vDmK98808ObK" /> </a> <a href="https://offer.gter.net/post" target="_blank" style="margin-right: 10px"> <img class="post-item" src="https://framework.x-php.com/gter/forum/img/post-offer.png?v=vDmK98808ObK" /> </a> <a href="https://offer.gter.net/post/summary" target="_blank" style="margin-right: 10px"> <img class="post-item" src="https://framework.x-php.com/gter/forum/img/post-summary.png?v=vDmK98808ObK" /> </a> <a href="https://interviewexperience.gter.net/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="https://framework.x-php.com/gter/forum/img/post-mj.png?v=vDmK98808ObK" /> </a> <a href="https://vote.gter.net/publish" target="_blank"> <img class="post-item" src="https://framework.x-php.com/gter/forum/img/post-vote.png?v=vDmK98808ObK" /> </a>`
console.log(postList);
postList.style.display = 'flex'
} else if (location.href.indexOf('search') != -1) {
const box = document.querySelector(".head-top")
box.querySelector(".input-box").style.display = "none"
box.querySelector(".sign-in").style.display = "none"
} else if (location.href.indexOf("publish") != -1) {
const box = document.querySelector(".head-top")
if (box) document.body.removeChild(box)
} else {
const signIn = document.querySelector('.head-top .sign-in')
signIn.innerHTML = `<div class="sign-in-no-box" onclick="headSignIn()">
<img class="sign-in-bj" src="https://framework.x-php.com/gter/forum/img/sign-in-bj.svg?v=vDmK98808ObK" /><img class="coin-bj" src="https://framework.x-php.com/gter/forum/img/coin-bj.svg?v=vDmK98808ObK" />
<img class="coin-icon" src="https://framework.x-php.com/gter/forum/img/coin-icon.png?v=vDmK98808ObK" /><span class="text flex1">签到领寄托币</span>
<div class="sign-go flexcenter">
<img class="sign-go-bj" src="https://framework.x-php.com/gter/forum/img/sign-go.svg?v=vDmK98808ObK" /> GO
</div>
<img class="petal1" src="https://framework.x-php.com/gter/forum/img/petal1.png?v=vDmK98808ObK" />
<img class="petal2" src="https://framework.x-php.com/gter/forum/img/petal2.png?v=vDmK98808ObK" />
<img class="petal3" src="https://framework.x-php.com/gter/forum/img/petal3.png?v=vDmK98808ObK" />
</div>
<div class="sign-in-already-box">
<img class="sign-icon" src="https://framework.x-php.com/gter/forum/img/sign-icon.png?v=vDmK98808ObK" />
<span>已签到,明天再来</span>
</div>`
signIn.style.display = 'flex'
let userInfoWinTimerCount = 0;
const userInfoWinTimer = setInterval(() => {
if (location.host == "127.0.0.1:5501") return;
if (todaysignedState) {
clearInterval(userInfoWinTimer);
if (todaysigned == 1) {
signIn.classList.add('sign-in-already')
signIn.classList.remove("sign-in-no");
}
}
userInfoWinTimerCount++;
if (userInfoWinTimerCount >= 3000) clearInterval(userInfoWinTimer);
}, 50);
}
function headSignIn() {
SignInComponent.initComponent();
}
const searchInput = document.querySelector('.head-top .input')
// 绑定 blur 和 focus 事件
if (searchInput) {
searchInput.addEventListener('blur', function () {
setTimeout(() => {
const historyBox = document.querySelector('.head-top .search-box-history')
if (historyBox) historyBox.style.display = 'none'
}, 300);
const inputBox = document.querySelector('.head-top .input-box')
if (inputBox) inputBox.classList.remove('pitch')
startCarousel();
})
searchInput.addEventListener('focus', () => {
const historyBox = document.querySelector('.head-top .search-box-history')
const historyItem = historyBox.querySelectorAll(".search-box-history-item")
if (historyBox && historyItem.length > 0) historyBox.style.display = 'block'
const inputBox = document.querySelector('.head-top .input-box')
if (inputBox) inputBox.classList.add('pitch')
if (carouselTimer) clearInterval(carouselTimer);
})
// 绑定回车事件
searchInput.addEventListener('keydown', (e) => {
if (e.key == 'Enter') searchEvent()
})
searchInput.addEventListener('input', (e) => {
const value = e.target.value || ''
const placeholder = document.querySelector(".head-top .placeholder")
if (value) placeholder.style.display = 'none'
else placeholder.style.display = 'block'
})
}
let historySearchList = []
// 获取历史搜索
const getHistorySearch = () => {
const data = JSON.parse(localStorage.getItem("history-search")) || [];
historySearchList = data;
let itemAll = ``
data.forEach((item, index) => itemAll += `<div class="search-box-history-item one-line-display" onclick="searchEvent('${item}')">${item}</div>`) // 绑定事件 searchEvent 点击搜索)
const historyList = document.querySelector('.search-box-history-list')
historyList.innerHTML = itemAll
};
if (location.href.indexOf("/publish") == -1 && location.href.indexOf("/search") == -1) getHistorySearch();
const searchEvent = (value) => {
if (window.innerWidth <= 480) {
redirectToExternalWebsite("/search");
return
}
const kw = value || searchInput.value || hotSearchWords[currentIndex]?.keyword || "";;
if (!kw) return;
historySearchList.unshift(kw);
historySearchList = [...new Set(historySearchList)];
if (historySearchList.length > 10) historySearchList = historySearchList.splice(0, 10);
localStorage.setItem("history-search", JSON.stringify(historySearchList));
redirectToExternalWebsite("/search/" + kw);
searchInput.value = ""
}
let hotSearchWords = [];
const renderingPlaceholder = () => {
let itemAll = ``
hotSearchWords.forEach(item => {
itemAll += `<div class="item one-line-display" >大家都在搜:${item.keyword}</div>`
})
const sliceHotSearchWords = hotSearchWords.slice(0, 2)
sliceHotSearchWords.forEach(item => {
itemAll += `<div class="item one-line-display" >大家都在搜:${item.keyword}</div>`
})
const placeholderBox = document.querySelector('.placeholder .placeholder-box')
placeholderBox.innerHTML = itemAll
}
const getWConfigg = () => {
ajaxGet("/v2/api/config/website").then((res) => {
if (res.code == 200) {
let data = res["data"] || {};
hotSearchWords = data.hotSearchWords || [];
renderingPlaceholder()
data.time = new Date().toISOString();
localStorage.setItem("wConfig", JSON.stringify(data));
}
});
};
const checkWConfig = () => {
const wConfig = JSON.parse(localStorage.getItem("wConfig")) || {};
if (wConfig.time) {
const time = new Date(wConfig.time);
const now = new Date();
if (now - time > 24 * 60 * 60 * 1000) getWConfigg();
else {
hotSearchWords = wConfig.hotSearchWords || [];
renderingPlaceholder()
}
} else getWConfigg();
};
checkWConfig()
const renderCurrentIndex = () => {
const placeholderBox = document.querySelector('.placeholder .placeholder-box')
if (placeholderBox) placeholderBox.style.transform = `translateY(${-currentIndex * 36}px)`
}
let currentIndex = 0; // 当前显示的关键词索引
let carouselTimer = null; // 轮播定时器
// 启动轮播函数
const startCarousel = () => {
// 清除已有的定时器
if (carouselTimer) clearInterval(carouselTimer);
// 设置新的定时器,每秒滚动一次
carouselTimer = setInterval(() => {
if (hotSearchWords.length > 1) {
if (currentIndex >= hotSearchWords.length - 1) {
currentIndex++;
setTimeout(() => {
currentIndex = 0;
}, 2300);
} else currentIndex++;
}
renderCurrentIndex()
}, 2300);
};
startCarousel();
const openHeadPop = () => {
if (window["userInfoWin"]?.uin > 0 || window["userInfoWin"]?.uid > 0) {
// 登录
const headMoreLeft = document.querySelector(".head-pop .head-more-left")
headMoreLeft.innerHTML = `<img class="head-more-userinfo-avatar" src="${window["userInfoWin"]?.avatar}" alt=""><div class="head-more-userinfo-username">${window["userInfoWin"]?.nickname}</div>`
} else {
const avatar = document.querySelector(".head-pop .head-more-userinfo-avatar")
avatar.src = "/img/defaultAvatar.png"
const headMoreRight = document.querySelector(".head-pop .head-more-right")
headMoreRight.style.display = "block"
}
document.querySelector(".head-pop").classList.add("head-pop-show");
}
const skipLoginUrl = (e) => {
if (window["userInfoWin"]?.uin > 0 || window["userInfoWin"]?.uid > 0) { }
else {
e.preventDefault();
go_ajax_Login();
}
}
const crossHeadPop = () => document.querySelector(".head-pop").classList.remove("head-pop-show");
</script>
</body>
</html>

View File

@@ -200,7 +200,7 @@
<div class="text">{{ item.name }}</div>
<img class="icon" src="https://framework.x-php.com/gter/forum/img/arrows-circle-red.svg?v=vDmK98808ObK" />
</a>
<div v-else class="item flexacenter">
<div v-else class="item flexacenter" @click.stop="linkClick(item.type)">
<div class="text">{{ item.name }}</div>
<img class="icon" src="https://framework.x-php.com/gter/forum/img/arrows-circle-red.svg?v=vDmK98808ObK" />
<div class="QRcode-box flexcenter">
@@ -338,14 +338,14 @@
</div>
</div>
<template v-for="(item,index) in list" :key="index">
<item-forum v-if="item.type == 'thread'" :itemdata="item"></item-forum>
<!-- <item-offer v-if=" item.type == 'offer'" :itemdata="item"></item-offer>
<!-- <item-forum v-if="item.type == 'thread'" :itemdata="item"></item-forum> -->
<item-offer v-if=" item.type == 'offer'" :itemdata="item"></item-offer>
<item-summary v-else-if="item.type == 'offer_summary'" :itemdata="item"></item-summary>
<item-vote v-else-if="item.type == 'vote'" :itemdata="item"></item-vote>
<item-mj v-else-if="item.type == 'interviewexperience'" :itemdata="item"></item-mj>
<item-tenement v-else-if="item.type == 'tenement'" :itemdata="item"></item-tenement>
<item-project v-else-if="item.type == 'programs' || tabValue == 'xg'" :itemdata="item"></item-project>
<item-forum v-else :itemdata="item"></item-forum> -->
<item-forum v-else :itemdata="item"></item-forum>
</template>
<load-box :loading="loading"></load-box>
</div>
@@ -459,6 +459,9 @@
</div>
</div>
</div>
<huddle-box ref="huddleBoxRef"></huddle-box>
<helper-pop ref="helperPopRef"></helper-pop>
</div>
@@ -468,7 +471,7 @@
<!-- <script src="https://f.gter.net/js/public.js"></script> -->
<script type="module" src="https://framework.x-php.com/gter/forum/js/section.js?v=vDmK98808ObK"></script>
<script type="module" src="/js/sectionV2.js"></script>
<!-- <script type="module" src="https://f.gter.net/js/section.js"></script> -->
<script type="module" src="https://framework.x-php.com/gter/forum/../image/gter/commonCom/sign-in/sign-in.js?v=vDmK98808ObK"></script>