feat: 添加新图片资源及更新组件样式与功能

style: 调整CSS样式及优化布局
refactor: 重构组件逻辑及API调用
fix: 修复路径引用及图片加载问题
docs: 更新注释及文档内容
This commit is contained in:
DESKTOP-RQ919RC\Pc
2025-11-05 19:10:43 +08:00
parent 07f4401f67
commit 3365e5ee0a
43 changed files with 782 additions and 365 deletions

View File

@@ -42,8 +42,10 @@ export const headTop = defineComponent({
redirectToExternalWebsite("/search/" + searchText); redirectToExternalWebsite("/search/" + searchText);
}; };
return { state, signIn, input, defaultSearchText, goSearch }; let pitchState = ref(false);
return { pitchState, state, signIn, input, defaultSearchText, goSearch };
}, },
template: `<div class="head-top flexacenter"> <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"> <input class="input flex1" type="text" :placeholder="'大家都在搜:' + defaultSearchText" @keyup.enter="goSearch" v-model="input" /> <img class="icon" src="/img/search-icon.svg" @click="goSearch" /> </div> <div class="sign-in sign-in-no flexacenter" v-if="state == 0" @click="signIn()" v-cloak> <img class="sign-in-bj" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/sign-in-bj.svg" /> <img class="coin-bj" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/coin-bj.svg" /> <img class="coin-icon" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/coin-icon.png" /> <span class="text flex1">签到领寄托币</span> <div class="sign-go flexcenter"> <img class="sign-go-bj" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/sign-go.svg" /> GO </div> <img class="petal1" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/petal1.png" /> <img class="petal2" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/petal2.png" /> <img class="petal3" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/petal3.png" /> </div> <div class="sign-in sign-in-already flexcenter" v-else> <img class="sign-icon" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/sign-icon.png" /> <span>已签到,明天再来</span> </div></div>`, template: `<div class="head-top flexacenter"> <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" :class="{'pitch': pitchState}"> <input class="input flex1" type="text" :placeholder="'大家都在搜:' + defaultSearchText" @keyup.enter="goSearch" v-model="input" @focus="pitchState = true" @blur="pitchState = false" /> <img class="icon" src="/img/search-icon.svg" @click="goSearch" /> </div> <div class="sign-in sign-in-no flexacenter" v-if="state == 0" @click="signIn()" v-cloak> <img class="sign-in-bj" src="/img/sign-in-bj.svg" /> <img class="coin-bj" src="/img/coin-bj.svg" /> <img class="coin-icon" src="/img/coin-icon.png" /> <span class="text flex1">签到领寄托币</span> <div class="sign-go flexcenter"> <img class="sign-go-bj" src="/img/sign-go.svg" /> GO </div> <img class="petal1" src="/img/petal1.png" /> <img class="petal2" src="/img/petal2.png" /> <img class="petal3" src="/img/petal3.png" /> </div> <div class="sign-in sign-in-already flexcenter" v-else> <img class="sign-icon" src="/img/sign-icon.png" /> <span>已签到,明天再来</span> </div></div>`,
}); });

View File

@@ -3,26 +3,26 @@
<img class="logo" src="https://oss.gter.net/logo" alt="" /> <img class="logo" src="https://oss.gter.net/logo" alt="" />
</a> </a>
<div class="flex1"></div> <div class="flex1"></div>
<div class="input-box flexacenter"> <div class="input-box flexacenter" :class="{'pitch': pitchState}">
<input class="input flex1" type="text" :placeholder="'大家都在搜:' + defaultSearchText" @keyup.enter="goSearch" v-model="input" /> <input class="input flex1" type="text" :placeholder="'大家都在搜:' + defaultSearchText" @keyup.enter="goSearch" v-model="input" @focus="pitchState = true" @blur="pitchState = false" />
<img class="icon" src="/img/search-icon.svg" @click="goSearch" /> <img class="icon" src="/img/search-icon.svg" @click="goSearch" />
</div> </div>
<div class="sign-in sign-in-no flexacenter" v-if="state == 0" @click="signIn()" v-cloak> <div class="sign-in sign-in-no flexacenter" v-if="state == 0" @click="signIn()" v-cloak>
<img class="sign-in-bj" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/sign-in-bj.svg" /> <img class="sign-in-bj" src="/img/sign-in-bj.svg" />
<img class="coin-bj" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/coin-bj.svg" /> <img class="coin-bj" src="/img/coin-bj.svg" />
<img class="coin-icon" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/coin-icon.png" /> <img class="coin-icon" src="/img/coin-icon.png" />
<span class="text flex1">签到领寄托币</span> <span class="text flex1">签到领寄托币</span>
<div class="sign-go flexcenter"> <div class="sign-go flexcenter">
<img class="sign-go-bj" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/sign-go.svg" /> <img class="sign-go-bj" src="/img/sign-go.svg" />
GO GO
</div> </div>
<img class="petal1" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/petal1.png" /> <img class="petal1" src="/img/petal1.png" />
<img class="petal2" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/petal2.png" /> <img class="petal2" src="/img/petal2.png" />
<img class="petal3" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/petal3.png" /> <img class="petal3" src="/img/petal3.png" />
</div> </div>
<div class="sign-in sign-in-already flexcenter" v-else> <div class="sign-in sign-in-already flexcenter" v-else>
<img class="sign-icon" src="//framework.x-php.com/gter/image/gter/forum/assets/forum/sign-icon.png" /> <img class="sign-icon" src="/img/sign-icon.png" />
<span>已签到,明天再来</span> <span>已签到,明天再来</span>
</div> </div>
</div> </div>

View File

@@ -25,5 +25,5 @@ export const hotTag = defineComponent({
components: {}, components: {},
template: `<div class="hot-tag" v-if="list.length > 0"> <div class="hot-tag-title"> <img class="icon" src="./img/triangle-orange.svg" /> 热门标签 </div> <div class="list flexflex"> <a class="item" v-for="item in list" :href="'/tag/' + item.tagname" target="_blank">{{ item.tagname }}</a> </div></div>`, template: `<div class="hot-tag" v-if="list.length > 0"> <div class="hot-tag-title"> <img class="icon" src="/img/triangle-orange.svg" /> 热门标签 </div> <div class="list flexflex"> <a class="item" v-for="item in list" :href="'/tag/' + item.tagname" target="_blank">{{ item.tagname }}</a> </div></div>`,
}); });

View File

@@ -1,6 +1,6 @@
<div class="hot-tag" v-if="list.length > 0"> <div class="hot-tag" v-if="list.length > 0">
<div class="hot-tag-title"> <div class="hot-tag-title">
<img class="icon" src="./img/triangle-orange.svg" /> <img class="icon" src="/img/triangle-orange.svg" />
热门标签 热门标签
</div> </div>
<div class="list flexflex"> <div class="list flexflex">

View File

@@ -78,7 +78,7 @@ export const itemBottom = defineComponent({
const token = item.value.token || ""; const token = item.value.token || "";
ajax(`https://api.gter.net/v2/api/forum/postTopicCollect`, { ajax(`/v2/api/forum/postTopicCollect`, {
token, token,
}) })
.then((res) => { .then((res) => {

View File

@@ -12,6 +12,10 @@ export const itemForum = defineComponent({
type: Object, type: Object,
default: () => {}, default: () => {},
}, },
page: {
type: String,
default: "",
},
}, },
setup(props) { setup(props) {
@@ -29,5 +33,5 @@ export const itemForum = defineComponent({
itemHead, itemHead,
}, },
template: `<div class="item-box item-forum"> <item-head :itemdata="item"></item-head> <a v-if="item.title" class="title" :href="'/details/' + item.uniqid" target="_blank">{{ item.title }}</a> <a class="message two-line-display" :href="'/details/' + item.uniqid" target="_blank">{{ item.content }}</a> <item-bottom :itemdata="item"></item-bottom></div>`, template: `<div class="item-box item-forum"> <item-head :itemdata="item" :page="page"></item-head> <a v-if="item.title" class="title" :href="'/details/' + item.uniqid" target="_blank">{{ item.title }}</a> <a class="message two-line-display" :href="'/details/' + item.uniqid" target="_blank">{{ item.content }}</a> <item-bottom :itemdata="item" :page="page"></item-bottom></div>`,
}); });

View File

@@ -1,8 +1,8 @@
<div class="item-box item-forum"> <div class="item-box item-forum">
<item-head :itemdata="item"></item-head> <item-head :itemdata="item" :page="page"></item-head>
<a v-if="item.title" class="title" :href="'/details/' + item.uniqid" target="_blank">{{ item.title }}</a> <a v-if="item.title" class="title" :href="'/details/' + item.uniqid" target="_blank">{{ item.title }}</a>
<a class="message two-line-display" :href="'/details/' + item.uniqid" target="_blank">{{ item.content }}</a> <a class="message two-line-display" :href="'/details/' + item.uniqid" target="_blank">{{ item.content }}</a>
<item-bottom :itemdata="item"></item-bottom> <item-bottom :itemdata="item" :page="page"></item-bottom>
</div> </div>

View File

@@ -1,6 +1,6 @@
// my-component.js // my-component.js
// 引入全局 Vue 对象(因在 HTML 中通过 script 引入Vue 已挂载到 window // 引入全局 Vue 对象(因在 HTML 中通过 script 引入Vue 已挂载到 window
const { defineComponent, ref, provide, onMounted } = Vue; const { defineComponent, ref, provide, onMounted, inject } = Vue;
import { report } from "../report/report.js"; import { report } from "../report/report.js";
// 定义组件(直接使用模板) // 定义组件(直接使用模板)
@@ -11,6 +11,11 @@ export const itemHead = defineComponent({
type: Object, type: Object,
default: () => {}, default: () => {},
}, },
page: {
type: String,
default: "",
},
}, },
setup(props) { setup(props) {
@@ -89,20 +94,24 @@ export const itemHead = defineComponent({
}); });
}; };
// let cancelOperate = inject("cancelOperate"); // let handleDelete = inject("handleDelete");
let itemHead = ref(null);
// 删除 // 删除
const deleteItem = () => { const deleteItem = () => {
const target = item.value; const target = item.value;
console.log("deleteItem"); console.log("deleteItem", target, target.token);
managerDelete(target.token)
.then(() => {
const targetNode = itemHead.value;
if (!targetNode) return;
// managerDelete(target.token) const parentItemBox = targetNode.parentElement;
// .then(() => { if (parentItemBox?.classList.contains("item-box")) parentItemBox.style.display = "none";
// cancelOperate("like", token);
// }) })
// .finally(() => { .finally(() => {
// cutShow(); cutShow();
// }); });
}; };
// 编辑 // 编辑
@@ -116,12 +125,44 @@ export const itemHead = defineComponent({
redirectToExternalWebsite(`/space?uin=${uin}&uid=${uid}`); redirectToExternalWebsite(`/space?uin=${uin}&uid=${uid}`);
}; };
return { edit, deleteItem, goPersonalHomepage, reportState, cutShow, show, item, timestamp, sectionn, tags, ismanager, report, hide, recommend, essence }; const openedit = (type) => {
let url = ``;
if (type == "offer") url = `https://offer.gter.net/post/modify?id=${item.value.token}`;
else if (type == "offer_summary") url = `https://offer.gter.net/post/summary`;
redirectToExternalWebsite(url);
};
const anonymousState = ref(false);
const cutAnonymous = () => {
anonymousState.value = !anonymousState.value;
};
const cutAnonymousState = (state) => {
console.log("state", state);
const target = item.value;
ajax("/v2/api/forum/postTopicAnonymousStatus", {
token: target.token,
anonymous: state,
})
.then((res) => {
console.log("res", res);
if (res.code != 200) return;
const data = res.data || {};
target.anonymous = data.anonymous || 0;
item.value = target;
creationAlertBox("success", res.message || "操作成功");
})
.finally(() => {
cutAnonymous();
});
};
return { itemHead, cutAnonymousState, cutAnonymous, anonymousState, openedit, edit, deleteItem, goPersonalHomepage, reportState, cutShow, show, item, timestamp, sectionn, tags, ismanager, report, hide, recommend, essence };
}, },
components: { components: {
report, report,
}, },
template: `<div class="item-head flexacenter"> <div class="user-box flexacenter" @click="goPersonalHomepage(item?.user?.uin, item?.user?.uid)"> <img class="avatar" :src="item?.user?.avatar || item.avatar" /> <div class="name">{{ item?.user?.nickname || item.nickname || "匿名用户" }}</div> <img class="group" v-if="info?.group?.image" :src="info?.group?.image" /> </div> <div class="time">{{ timestamp }}</div> <div class="flex1"></div> <div class="view flexacenter"> <img class="icon" src="/img/eye-icon.svg" /> <div class="text">{{ item.views }}</div> </div> <div v-if="item.type != 'tenement'" class="btn flexcenter" @click.stop="cutShow"> <img class="icon" src="/img/dot-dot-dot-gray.png" /> </div> <div v-if="show"> <div class="mask" @click.stop="cutShow"></div> <div class="operate"> <div class="item" @click.stop="report">举报</div> <template v-if="ismanager"> <div class="item" @click.stop="hide">{{ item.hidden == 0 ? "隐藏" : "显示" }}</div> <div class="item" @click.stop="recommend">{{ item.recommend == 1 ? "取消" : "" }}推荐</div> <div class="item" @click.stop="essence">{{ item.best == 1 ? "取消" : "" }}精华</div> </template> <template v-if="item.type == 'thread' && item.ismyself"> <div class="item" @click.stop="edit">编辑</div> <div class="item" @click.stop="deleteItem">删除</div> </template> </div> </div></div><div class="label flexflex" v-if="sectionn?.length || tags?.length || item.recommend == 1 || item.best == 1"> <img class="item icon" v-if="item.recommend == 1 && item.best != 1" src="/img/recommend-icon.png" /> <img class="item icon" v-if="item.best == 1" src="/img/essence-icon.png" /> <a class="item blue" v-for="(item, index) in sectionn" :key="item" :href="'/section/' + item.uniqid" target="_blank">{{ item.name }}</a> <a class="item" v-for="(item, index) in tags" :key="item" :href="'/tag/' + item" target="_blank">{{ item }}</a></div><report v-if="reportState" :itemdata="item"></report>`, template: `<div class="item-head flexacenter" ref="itemHead"> <div class="user-box flexacenter" @click="goPersonalHomepage(item?.user?.uin, item?.user?.uid)"> <img class="avatar" :src="item?.user?.avatar || item.avatar" /> <div class="name">{{ item?.user?.nickname || item.nickname || "匿名用户" }}</div> <img class="group" v-if="info?.group?.image" :src="info?.group?.image" /> </div> <div class="time">{{ timestamp }}</div> <div class="flex1"></div> <div class="circlePen flexcenter" @click="openedit(item.type)" v-if="page == 'edit' && (item.type == 'offer' || item.type == 'offer_summary')"> <img class="icon" src="/img/pen-icon.png" /> </div> <div class="flexacenter" style="position: relative;"> <div class="anonymous-box flexcenter" @click.stop="cutAnonymous" v-if="page == 'edit' && (item.type == 'vote' || item.type == 'interviewexperience')"> <span v-if="item.anonymous == 0">公开</span> <span v-else>匿名</span> </div> <!-- 是否 公开发表 --> <template v-if="anonymousState"> <div class="mask" @click.stop="cutAnonymous"></div> <div class="isPublicityBox"> <div class="isPublicity-item" :class="{'green': item.anonymous == 0}" @click.stop="cutAnonymousState(0)">公开发表 <img v-if="item.anonymous == 0" class="isPublicityIcon" src="/img/u1829.svg"></image> </div> <div class="isPublicity-item" :class="{'green': item.anonymous != 0}" @click.stop="cutAnonymousState(1)">匿名发表 <img v-if="item.anonymous != 0" class="isPublicityIcon" src="/img/u1829.svg"></image> </div> </div> </template> </div> <div class="view flexacenter"> <img class="icon" src="/img/eye-icon.svg" /> <div class="text">{{ item.views }}</div> </div> <div v-if="item.type != 'tenement'" class="btn flexcenter" @click.stop="cutShow"> <img class="icon" src="/img/dot-dot-dot-gray.png" /> </div> <div v-if="show"> <div class="mask" @click.stop="cutShow"></div> <div class="operate"> <div class="item" @click.stop="report">举报</div> <template v-if="ismanager"> <div class="item" @click.stop="hide">{{ item.hidden == 0 ? "隐藏" : "显示" }}</div> <div class="item" @click.stop="recommend">{{ item.recommend == 1 ? "取消" : "" }}推荐</div> <div class="item" @click.stop="essence">{{ item.best == 1 ? "取消" : "" }}精华</div> </template> <template v-if="item.type == 'thread' && item.ismyself"> <div class="item" @click.stop="edit">编辑</div> <div class="item" @click.stop="deleteItem">删除</div> </template> <div class="item" v-if="page == 'edit' && item.type == 'vote'" @click.stop="deleteItem">删除</div> </div> </div></div><div class="label flexflex" v-if="sectionn?.length || tags?.length || item.recommend == 1 || item.best == 1"> <img class="item icon" v-if="item.recommend == 1 && item.best != 1" src="/img/recommend-icon.png" /> <img class="item icon" v-if="item.best == 1" src="/img/essence-icon.png" /> <a class="item blue" v-for="(item, index) in sectionn" :key="item" :href="'/section/' + item.uniqid" target="_blank">{{ item.name }}</a> <a class="item" v-for="(item, index) in tags" :key="item" :href="'/tag/' + item" target="_blank">{{ item }}</a></div><report v-if="reportState" :itemdata="item"></report>`,
}); });

View File

@@ -1,4 +1,4 @@
<div class="item-head flexacenter"> <div class="item-head flexacenter" ref="itemHead">
<div class="user-box flexacenter" @click="goPersonalHomepage(item?.user?.uin, item?.user?.uid)"> <div class="user-box flexacenter" @click="goPersonalHomepage(item?.user?.uin, item?.user?.uid)">
<img class="avatar" :src="item?.user?.avatar || item.avatar" /> <img class="avatar" :src="item?.user?.avatar || item.avatar" />
<div class="name">{{ item?.user?.nickname || item.nickname || "匿名用户" }}</div> <div class="name">{{ item?.user?.nickname || item.nickname || "匿名用户" }}</div>
@@ -8,6 +8,31 @@
<div class="time">{{ timestamp }}</div> <div class="time">{{ timestamp }}</div>
<div class="flex1"></div> <div class="flex1"></div>
<div class="circlePen flexcenter" @click="openedit(item.type)" v-if="page == 'edit' && (item.type == 'offer' || item.type == 'offer_summary')">
<img class="icon" src="/img/pen-icon.png" />
</div>
<div class="flexacenter" style="position: relative;">
<div class="anonymous-box flexcenter" @click.stop="cutAnonymous" v-if="page == 'edit' && (item.type == 'vote' || item.type == 'interviewexperience')">
<span v-if="item.anonymous == 0">公开</span>
<span v-else>匿名</span>
</div>
<!-- 是否 公开发表 -->
<template v-if="anonymousState">
<div class="mask" @click.stop="cutAnonymous"></div>
<div class="isPublicityBox">
<div class="isPublicity-item" :class="{'green': item.anonymous == 0}" @click.stop="cutAnonymousState(0)">公开发表
<img v-if="item.anonymous == 0" class="isPublicityIcon" src="/img/u1829.svg"></image>
</div>
<div class="isPublicity-item" :class="{'green': item.anonymous != 0}" @click.stop="cutAnonymousState(1)">匿名发表
<img v-if="item.anonymous != 0" class="isPublicityIcon" src="/img/u1829.svg"></image>
</div>
</div>
</template>
</div>
<div class="view flexacenter"> <div class="view flexacenter">
<img class="icon" src="/img/eye-icon.svg" /> <img class="icon" src="/img/eye-icon.svg" />
<div class="text">{{ item.views }}</div> <div class="text">{{ item.views }}</div>
@@ -31,6 +56,7 @@
<div class="item" @click.stop="edit">编辑</div> <div class="item" @click.stop="edit">编辑</div>
<div class="item" @click.stop="deleteItem">删除</div> <div class="item" @click.stop="deleteItem">删除</div>
</template> </template>
<div class="item" v-if="page == 'edit' && item.type == 'vote'" @click.stop="deleteItem">删除</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -12,6 +12,10 @@ export const itemMj = defineComponent({
type: Object, type: Object,
default: () => {}, default: () => {},
}, },
page: {
type: String,
default: "",
},
}, },
setup(props) { setup(props) {
@@ -25,5 +29,5 @@ export const itemMj = defineComponent({
itemHead, itemHead,
}, },
template: `<div class="item-box item-mj"> <item-head :itemdata="item"></item-head> <a class="school flexacenter" :href="item.url" target="_blank"> <img class="icon" v-if="item.data.schoollogo" :src="item.data.schoollogo" mode="heightFix"></image> <div class="text flex1 one-line-display">{{ item.data.schoolname }}</div> </a> <a class="major flexacenter" v-if="item.data.professional" :href="item.url" target="_blank"> <div class="key">{{ item.data.project ? '专业' : '项目/专业' }}</div> <div class="value flex1 one-line-display">{{ item.data.professional }}</div> </a> <a class="major flexacenter" v-if="item.data.project" :href="item.url" target="_blank"> <div class="key">项目</div> <div class="value flex1 one-line-display">{{ item.data.project }}</div> </a> <a class="major flexacenter" v-if="item.data.interviewtime" :href="item.url" target="_blank"> <div class="key">面试</div> <div class="value time flex1 one-line-display">{{ item.data.interviewtime }}</div> </a> <a class="message" v-if="item.content" :href="item.url" target="_blank">{{ item.content }}</a> <item-bottom :itemdata="item"></item-bottom></div>`, template: `<div class="item-box item-mj"> <item-head :itemdata="item" :page="page"></item-head> <a class="school flexacenter" :href="item.url" target="_blank"> <img class="icon" v-if="item.data.schoollogo" :src="item.data.schoollogo" mode="heightFix"></image> <div class="text flex1 one-line-display">{{ item.data.schoolname }}</div> </a> <a class="major flexacenter" v-if="item.data.professional" :href="item.url" target="_blank"> <div class="key">{{ item.data.project ? '专业' : '项目/专业' }}</div> <div class="value flex1 one-line-display">{{ item.data.professional }}</div> </a> <a class="major flexacenter" v-if="item.data.project" :href="item.url" target="_blank"> <div class="key">项目</div> <div class="value flex1 one-line-display">{{ item.data.project }}</div> </a> <a class="major flexacenter" v-if="item.data.interviewtime" :href="item.url" target="_blank"> <div class="key">面试</div> <div class="value time flex1 one-line-display">{{ item.data.interviewtime }}</div> </a> <a class="message" v-if="item.content" :href="item.url" target="_blank">{{ item.content }}</a> <item-bottom :itemdata="item" :page="page"></item-bottom></div>`,
}); });

View File

@@ -1,5 +1,5 @@
<div class="item-box item-mj"> <div class="item-box item-mj">
<item-head :itemdata="item"></item-head> <item-head :itemdata="item" :page="page"></item-head>
<a class="school flexacenter" :href="item.url" target="_blank"> <a class="school flexacenter" :href="item.url" target="_blank">
<img class="icon" v-if="item.data.schoollogo" :src="item.data.schoollogo" mode="heightFix"></image> <img class="icon" v-if="item.data.schoollogo" :src="item.data.schoollogo" mode="heightFix"></image>
<div class="text flex1 one-line-display">{{ item.data.schoolname }}</div> <div class="text flex1 one-line-display">{{ item.data.schoolname }}</div>
@@ -22,5 +22,5 @@
<a class="message" v-if="item.content" :href="item.url" target="_blank">{{ item.content }}</a> <a class="message" v-if="item.content" :href="item.url" target="_blank">{{ item.content }}</a>
<item-bottom :itemdata="item"></item-bottom> <item-bottom :itemdata="item" :page="page"></item-bottom>
</div> </div>

View File

@@ -12,64 +12,16 @@ export const itemOffer = defineComponent({
type: Object, type: Object,
default: () => {}, default: () => {},
}, },
page: {
type: String,
default: "",
},
}, },
setup(props) { setup(props) {
let item = ref({ ...props.itemdata }); let item = ref({ ...props.itemdata });
item.value["url"] = "/details/" + item.value.uniqid; item.value["url"] = "/details/" + item.value.uniqid;
// let isLogin = ref(true);
// let realname = ref(1); // 是否已经实名
// let userInfoWin = ref({
// authority: ["comment.edit", "comment.delete", "offercollege.hide", "offersummary.hide", "mj.hide", "topic:manager", "topic:hide"],
// avatar: "https://nas.gter.net:9008/avatar/97K4EWIMLrsbGTWXslC2WFVSEKWOikN42jDKLNjtax7HL4xtfMOJSdU9oWFhY2E~/middle?random=1761733169",
// groupid: 3,
// nickname: "肖荣豪",
// realname: 1,
// token: "01346a38444d71aaadb3adad52b52c39",
// uid: 500144,
// uin: 4238049,
// });
// 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;
// };
// 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);
return { item }; return { item };
}, },
@@ -78,5 +30,5 @@ export const itemOffer = defineComponent({
itemHead, itemHead,
}, },
template: `<div class="item-box item-offer"> <item-head :itemdata="item"></item-head> <a class="school flexacenter" :href="item.url" target="_blank"> <img class="icon" v-if="item.data.schoollogo" :src="item.data.schoollogo" mode="heightFix"></image> <div class="text flex1 one-line-display">{{ item.data.schoolname }}</div> </a> <a class="major flexacenter" v-if="item.data.professional" :href="item.url" target="_blank"> <div class="key">{{ item.data.project ? '专业' : '项目/专业' }}</div> <div class="value flex1 one-line-display">{{ item.data.professional }}</div> </a> <a class="major flexacenter" v-if="item.data.project" :href="item.url" target="_blank"> <div class="key">项目</div> <div class="value flex1 one-line-display">{{ item.data.project }}</div> </a> <a class="info flexacenter" :href="item.url" target="_blank"> {{ item.data.semester }} <div class="line"></div> {{ item.data.degree }} <div class="line"></div> <div class="results" :class="['r' + item.data.apply_results]">{{ item.data.apply_results_text }}</div> </a> <a class="message" v-if="item.content" :href="item.url" target="_blank">{{ item.content }}</a> <item-bottom :itemdata="item"></item-bottom></div>`, template: `<div class="item-box item-offer"> <item-head :itemdata="item" :page="page"></item-head> <a class="school flexacenter" :href="item.url" target="_blank"> <img class="icon" v-if="item.data.schoollogo" :src="item.data.schoollogo" mode="heightFix"></image> <div class="text flex1 one-line-display">{{ item.data.schoolname }}</div> </a> <a class="major flexacenter" v-if="item.data.professional" :href="item.url" target="_blank"> <div class="key">{{ item.data.project ? '专业' : '项目/专业' }}</div> <div class="value flex1 one-line-display">{{ item.data.professional }}</div> </a> <a class="major flexacenter" v-if="item.data.project" :href="item.url" target="_blank"> <div class="key">项目</div> <div class="value flex1 one-line-display">{{ item.data.project }}</div> </a> <a class="info flexacenter" :href="item.url" target="_blank"> {{ item.data.semester }} <div class="line"></div> {{ item.data.degree }} <div class="line"></div> <div class="results" :class="['r' + item.data.apply_results]">{{ item.data.apply_results_text }}</div> </a> <a class="message" v-if="item.content" :href="item.url" target="_blank">{{ item.content }}</a> <item-bottom :itemdata="item" :page="page"></item-bottom></div>`,
}); });

View File

@@ -1,5 +1,5 @@
<div class="item-box item-offer"> <div class="item-box item-offer">
<item-head :itemdata="item"></item-head> <item-head :itemdata="item" :page="page"></item-head>
<a class="school flexacenter" :href="item.url" target="_blank"> <a class="school flexacenter" :href="item.url" target="_blank">
<img class="icon" v-if="item.data.schoollogo" :src="item.data.schoollogo" mode="heightFix"></image> <img class="icon" v-if="item.data.schoollogo" :src="item.data.schoollogo" mode="heightFix"></image>
<div class="text flex1 one-line-display">{{ item.data.schoolname }}</div> <div class="text flex1 one-line-display">{{ item.data.schoolname }}</div>
@@ -24,5 +24,5 @@
</a> </a>
<a class="message" v-if="item.content" :href="item.url" target="_blank">{{ item.content }}</a> <a class="message" v-if="item.content" :href="item.url" target="_blank">{{ item.content }}</a>
<item-bottom :itemdata="item"></item-bottom> <item-bottom :itemdata="item" :page="page"></item-bottom>
</div> </div>

View File

@@ -12,6 +12,10 @@ export const itemSummary = defineComponent({
type: Object, type: Object,
default: () => {}, default: () => {},
}, },
page: {
type: String,
default: "",
},
}, },
setup(props) { setup(props) {
@@ -26,5 +30,5 @@ export const itemSummary = defineComponent({
itemHead, itemHead,
}, },
template: `<div class="item-box item-summary"> <item-head :itemdata="item"></item-head> <a class="title" v-if="item.title" :href="item.url" target="_blank">{{ item.title }}</a> <a class="message one-line-display" :href="item.url" target="_blank" v-if="item.content">{{ item.content }}</a> <a class="total flexacenter" :href="item.url" target="_blank"> <div>共</div> <div class="num">{{ item.data.offercount }}</div> <div>个Offer</div> </a> <a class="list flexacenter" :href="item.url" target="_blank"> <div class="item flexflex" v-for="(it,i) in item.data.offerlist" :key="i"> <div class="item-content flexflex"> <div class="school flexacenter"> <img class="icon" v-if="it.schoollogo" :src="it.schoollogo" mode="heightFix"></image> <div class="name one-line-display flex1">{{ it.schoolname }}</div> </div> <div class="major one-line-display" v-if="it.professional">{{ it.professional }}</div> <div class="info flexacenter"> {{ it.semester || '25Fall' }} <div class="line"></div> {{ it.degree || 'MSc' }} <div class="line"></div> <div class="results" :class="['r' + it.apply_results]">{{ it.apply_results_text || 'Offer' }}</div> </div> </div> </div> <div v-if="item.data.offercount > 3" class="item more flexcenter"> <div class="item-content flexcenter"> <div class="">查看更多</div> <img class="icon" src="/img/arrows-circle-dark-blue.svg" mode="heightFix"></image> </div> </div> </a> <item-bottom :itemdata="item"></item-bottom></div>`, template: `<div class="item-box item-summary"> <item-head :itemdata="item" :page="page"></item-head> <a class="title" v-if="item.title" :href="item.url" target="_blank">{{ item.title }}</a> <a class="message one-line-display" :href="item.url" target="_blank" v-if="item.content">{{ item.content }}</a> <a class="total flexacenter" :href="item.url" target="_blank"> <div>共</div> <div class="num">{{ item.data.offercount }}</div> <div>个Offer</div> </a> <a class="list flexacenter" :href="item.url" target="_blank"> <div class="item flexflex" v-for="(it,i) in item.data.offerlist" :key="i"> <div class="item-content flexflex"> <div class="school flexacenter"> <img class="icon" v-if="it.schoollogo" :src="it.schoollogo" mode="heightFix"></image> <div class="name one-line-display flex1">{{ it.schoolname }}</div> </div> <div class="major one-line-display" v-if="it.professional">{{ it.professional }}</div> <div class="info flexacenter"> {{ it.semester || '25Fall' }} <div class="line"></div> {{ it.degree || 'MSc' }} <div class="line"></div> <div class="results" :class="['r' + it.apply_results]">{{ it.apply_results_text || 'Offer' }}</div> </div> </div> </div> <div v-if="item.data.offercount > 3" class="item more flexcenter"> <div class="item-content flexcenter"> <div class="">查看更多</div> <img class="icon" src="/img/arrows-circle-dark-blue.svg" mode="heightFix"></image> </div> </div> </a> <item-bottom :itemdata="item" :page="page"></item-bottom></div>`,
}); });

View File

@@ -1,5 +1,5 @@
<div class="item-box item-summary"> <div class="item-box item-summary">
<item-head :itemdata="item"></item-head> <item-head :itemdata="item" :page="page"></item-head>
<a class="title" v-if="item.title" :href="item.url" target="_blank">{{ item.title }}</a> <a class="title" v-if="item.title" :href="item.url" target="_blank">{{ item.title }}</a>
<a class="message one-line-display" :href="item.url" target="_blank" v-if="item.content">{{ item.content }}</a> <a class="message one-line-display" :href="item.url" target="_blank" v-if="item.content">{{ item.content }}</a>
<a class="total flexacenter" :href="item.url" target="_blank"> <a class="total flexacenter" :href="item.url" target="_blank">
@@ -32,5 +32,5 @@
</div> </div>
</div> </div>
</a> </a>
<item-bottom :itemdata="item"></item-bottom> <item-bottom :itemdata="item" :page="page"></item-bottom>
</div> </div>

View File

@@ -12,6 +12,10 @@ export const itemTenement = defineComponent({
type: Object, type: Object,
default: () => {}, default: () => {},
}, },
page: {
type: String,
default: "",
},
}, },
setup(props) { setup(props) {
@@ -84,5 +88,5 @@ export const itemTenement = defineComponent({
itemHead, itemHead,
}, },
template: `<div class="item-box item-tenement"> <item-head :itemdata="item"></item-head> <div class="label flexflex" v-if="sectionn?.length || tags?.length"> <img class="item icon" v-if="item.isintermediary == 1" style="width: 94px; cursor: auto;" src="/img/intermediary-icon.png" /> <img class="item icon" v-if="item.verified == 1" style="width: 94px; cursor: auto;" src="/img/attestation-icon.png" /> <div class="item blue" v-for="(item, index) in sectionn" :key="item" style="cursor: auto;">{{ item }}</div> <div class="item" v-for="(item, index) in tags" :key="item" style="cursor: auto;">{{ item }}</div> </div> <a class="title" :href="item.url" target="_blank">{{ item.subject }}</a> <a class="site-box flexacenter" :href="item.url" target="_blank"> <template v-if="item.intermediary == 6"> <div class="site-item flexacenter" v-for="(item, index) in item.location" :key="index"> <img class="site-icon" src="/img/orientation.png"> {{ item }} </div> </template> <div v-else class="site-item flexacenter"> <img class="site-icon" src="/img/orientation.png"> {{ item.location || '' }} </div> </a> <a class="price-section flexacenter" :href="item.url" target="_blank"> <div class="unit">HK$</div> <div class="price">{{ item.rent }}</div> <span class="text">/月</span> <div class="rentalduration">[ 租期{{ item.rentalduration }} ]</div> </a> <a class="picture flexacenter" :href="item.url" target="_blank" v-if="item.images?.length != 0"> <img class="picture-item" v-for="(item, index) in item.images" :key="index" :src="item" alt=""> </a> <item-bottom :itemdata="item"></item-bottom></div>`, template: `<div class="item-box item-tenement"> <item-head :itemdata="item" :page="page"></item-head> <div class="label flexflex" v-if="sectionn?.length || tags?.length"> <img class="item icon" v-if="item.isintermediary == 1" style="width: 94px; cursor: auto;" src="/img/intermediary-icon.png" /> <img class="item icon" v-if="item.verified == 1" style="width: 94px; cursor: auto;" src="/img/attestation-icon.png" /> <div class="item blue" v-for="(item, index) in sectionn" :key="item" style="cursor: auto;">{{ item }}</div> <div class="item" v-for="(item, index) in tags" :key="item" style="cursor: auto;">{{ item }}</div> </div> <a class="title" :href="item.url" target="_blank">{{ item.subject }}</a> <a class="site-box flexacenter" :href="item.url" target="_blank"> <template v-if="item.intermediary == 6"> <div class="site-item flexacenter" v-for="(item, index) in item.location" :key="index"> <img class="site-icon" src="/img/orientation.png"> {{ item }} </div> </template> <div v-else class="site-item flexacenter"> <img class="site-icon" src="/img/orientation.png"> {{ item.location || '' }} </div> </a> <a class="price-section flexacenter" :href="item.url" target="_blank"> <div class="unit">HK$</div> <div class="price">{{ item.rent }}</div> <span class="text">/月</span> <div class="rentalduration">[ 租期{{ item.rentalduration }} ]</div> </a> <a class="picture flexacenter" :href="item.url" target="_blank" v-if="item.images?.length != 0"> <img class="picture-item" v-for="(item, index) in item.images" :key="index" :src="item" alt=""> </a> <item-bottom :itemdata="item" :page="page"></item-bottom></div>`,
}); });

View File

@@ -1,5 +1,5 @@
<div class="item-box item-tenement"> <div class="item-box item-tenement">
<item-head :itemdata="item"></item-head> <item-head :itemdata="item" :page="page"></item-head>
<div class="label flexflex" v-if="sectionn?.length || tags?.length"> <div class="label flexflex" v-if="sectionn?.length || tags?.length">
<img class="item icon" v-if="item.isintermediary == 1" style="width: 94px; cursor: auto;" src="/img/intermediary-icon.png" /> <img class="item icon" v-if="item.isintermediary == 1" style="width: 94px; cursor: auto;" src="/img/intermediary-icon.png" />
<img class="item icon" v-if="item.verified == 1" style="width: 94px; cursor: auto;" src="/img/attestation-icon.png" /> <img class="item icon" v-if="item.verified == 1" style="width: 94px; cursor: auto;" src="/img/attestation-icon.png" />
@@ -33,5 +33,5 @@
<img class="picture-item" v-for="(item, index) in item.images" :key="index" :src="item" alt=""> <img class="picture-item" v-for="(item, index) in item.images" :key="index" :src="item" alt="">
</a> </a>
<item-bottom :itemdata="item"></item-bottom> <item-bottom :itemdata="item" :page="page"></item-bottom>
</div> </div>

View File

@@ -12,11 +12,62 @@ export const itemVote = defineComponent({
type: Object, type: Object,
default: () => {}, default: () => {},
}, },
page: {
type: String,
default: "",
},
}, },
setup(props) { setup(props) {
// 处理 截止时间
const handleDeadline = (dateTimeStamp = "") => {
if (typeof dateTimeStamp == "number") dateTimeStamp = dateTimeStamp ? dateTimeStamp * 1000 : null;
if (typeof dateTimeStamp == "string" && dateTimeStamp.match(/^\d{4}-\d{2}-\d{2}$/)) dateTimeStamp += " 23:59:59";
const timestamp = new Date(dateTimeStamp.replace(/-/g, "/")).getTime();
const now = Date.now();
const diffValue = timestamp - now;
if (diffValue < 0) return null;
const units = [
{
value: 24 * 60 * 60 * 1000,
unit: "天",
},
{
value: 60 * 60 * 1000,
unit: "小时",
},
{
value: 60 * 1000,
unit: "分钟",
},
{
value: 1000,
unit: "秒",
},
];
for (const { value, unit } of units) {
if (diffValue >= value) {
return {
num: Math.round(diffValue / value),
unit,
};
}
}
return {
num: 0,
unit: "秒",
};
};
let item = ref({ ...props.itemdata }); let item = ref({ ...props.itemdata });
item.value['url'] = 'https://vote.gter.net/details/' + item.value.uniqid; item.value["time"] = handleDeadline(item.value.data.deadline);
item.value["url"] = "/details/" + item.value.uniqid;
const option = item.value.data.option || [];
item.value["isvote"] = option.some((item) => item.selected == 1);
return { item }; return { item };
}, },
@@ -25,5 +76,5 @@ export const itemVote = defineComponent({
itemHead, itemHead,
}, },
template: `<div class="item-box item-vote"> <item-head :itemdata="item"></item-head> <a class="title" :href="item.url" target="_blank">{{ item.title }}</a> <a class="message one-line-display" v-if="item.content">{{ item.content }}</a> <a class="info flexacenter" target="_blank" :href="item.url"> <template v-if="item?.data.status == 1"> <div class="status">进行中</div> <div class="line"></div> <div class="num">{{ item?.time.num }}</div>{{ item.time.unit }}后结束 </template> <div v-else class="status end">已结束</div> <div class="line"></div> <div class="num">{{ item?.data?.votes }}</div>人参与 </a> <a class="list" :class="{ 'voted': !item.time || item.isvote }" target="_blank" :href="item.url"> <div class="list-item flexcenter " v-for="(item, index) in item?.data?.option" :key="index"> <div class="list-top flexacenter"> <img v-if="item.selected" class="list-tick" src="/img/vote-tick.svg"> <div v-else class="list-serial flexcenter">{{ index + 1 }}</div> <div class="list-text one-line-display flex1">{{ item.value }}</div> </div> <div class="list-bottom flexacenter"> <div class="list-length" :style="{ width: item.percentage + '%' }"></div>{{ item.count }} </div> </div> </a> <item-bottom :itemdata="item"></item-bottom></div>`, template: `<div class="item-box item-vote"> <item-head :itemdata="item" :page="page"></item-head> <a class="title" :href="item.url" target="_blank">{{ item.title }}</a> <a class="message one-line-display" v-if="item.content">{{ item.content }}</a> <a class="info flexacenter" target="_blank" :href="item.url"> <template v-if="item?.data.status == 1"> <div class="status">进行中</div> <div class="line"></div> <div class="num">{{ item?.time.num }}</div>{{ item.time.unit }}后结束 </template> <div v-else class="status end">已结束</div> <div class="line"></div> <div class="num">{{ item?.data?.votes }}</div>人参与 </a> <a class="list" :class="{ 'voted': !item.time || item.isvote }" target="_blank" :href="item.url"> <div class="list-item flexcenter " v-for="(item, index) in item?.data?.option" :key="index"> <div class="list-top flexacenter"> <img v-if="item.selected" class="list-tick" src="/img/vote-tick.svg"> <div v-else class="list-serial flexcenter">{{ index + 1 }}</div> <div class="list-text one-line-display flex1">{{ item.value }}</div> </div> <div class="list-bottom flexacenter"> <div class="list-length" :style="{ width: item.percentage + '%' }"></div>{{ item.count }} </div> </div> </a> <item-bottom :itemdata="item" :page="page"></item-bottom></div>`,
}); });

View File

@@ -1,5 +1,5 @@
<div class="item-box item-vote"> <div class="item-box item-vote">
<item-head :itemdata="item"></item-head> <item-head :itemdata="item" :page="page"></item-head>
<a class="title" :href="item.url" target="_blank">{{ item.title }}</a> <a class="title" :href="item.url" target="_blank">{{ item.title }}</a>
<a class="message one-line-display" v-if="item.content">{{ item.content }}</a> <a class="message one-line-display" v-if="item.content">{{ item.content }}</a>
<a class="info flexacenter" target="_blank" :href="item.url"> <a class="info flexacenter" target="_blank" :href="item.url">
@@ -25,5 +25,5 @@
</div> </div>
</div> </div>
</a> </a>
<item-bottom :itemdata="item"></item-bottom> <item-bottom :itemdata="item" :page="page"></item-bottom>
</div> </div>

View File

@@ -113,5 +113,5 @@ export const latestList = defineComponent({
itemHead, itemHead,
}, },
template: `<div class="posts-box box-newest " :class="['boxtype-' + boxtype]"> <div v-if="boxtype == 'newest'" class="box-newest-head flexacenter"> <img class="icon" src="/img/newest-icon.png" alt="" /> 最新 </div> <div v-else-if="boxtype == 'essence'" class="box-newest-head flexacenter"> <img class="icon" src="/img/essence.png" alt="" /> 精华阅读 </div> <div v-else class="slideshow-box"> <div class="tab-list flexacenter"> <div class="tab-item newest" :class="{'pitch': postsTab == 'newest'}" @click="tabPostsItem('newest')">最新</div> <div class="tab-item essence" :class="{'pitch': postsTab == 'essence'}" @click="tabPostsItem('essence')">精华</div> </div> </div> <div class="slideshow-content flexflex"> <!-- newest 最新 --> <div class="newest-side-box side-box"> <img class="bounding" src="/img/bounding-circle-green.svg" alt="" /> <div class="box"> <a v-for="(item, index) in latestList" :key="index" class="item flexacenter vuehide" :href="'/details/' + item.uniqid" target="_blank"> <div class="dot dot-green"></div> <div class="text one-line-display">{{ item.title }}</div> </a> </div> </div> <!-- essence 精选 --> <div class="essence-side-box side-box"> <img class="bounding" src="/img/bounding-circle-blue.svg" alt="" /> <div class="box"> <a v-for="(item, index) in topList" :key="index" class="item flexacenter vuehide" :href="'/details/' + item.uniqid" target="_blank"> <div class="dot"></div> <div class="text one-line-display">{{ item.title }}</div> </a> </div> </div> </div></div>`, template: `<div class="posts-box box-newest " :class="['boxtype-' + boxtype]"> <div v-if="boxtype == 'newest'" class="box-newest-head flexacenter"> <img class="icon" src="/img/newest-icon.png" alt="" /> 最新 </div> <div v-else-if="boxtype == 'essence'" class="box-newest-head flexacenter"> <img class="icon" src="/img/essence.png" alt="" /> 精华阅读 </div> <div v-else class="slideshow-box"> <div class="tab-list flexacenter"> <div class="tab-item newest" :class="{'pitch': postsTab == 'newest'}" @click="tabPostsItem('newest')">最新</div> <div class="tab-item essence" :class="{'pitch': postsTab == 'essence'}" @click="tabPostsItem('essence')">精华</div> </div> </div> <div class="slideshow-content flexflex"> <!-- newest 最新 --> <div class="newest-side-box side-box"> <img class="bounding" src="/img/bounding-circle-green.svg" alt="" /> <div class="box"> <a v-for="(item, index) in latestList" :key="index" class="item flexacenter vuehide" :href="'/details/' + item.uniqid" target="_blank"> <div class="dot dot-green"></div> <div class="text one-line-display">{{ item.title || item.content }}</div> </a> </div> </div> <!-- essence 精选 --> <div class="essence-side-box side-box"> <img class="bounding" src="/img/bounding-circle-blue.svg" alt="" /> <div class="box"> <a v-for="(item, index) in topList" :key="index" class="item flexacenter vuehide" :href="'/details/' + item.uniqid" target="_blank"> <div class="dot"></div> <div class="text one-line-display">{{ item.title || item.content }}</div> </a> </div> </div> </div></div>`,
}); });

View File

@@ -20,7 +20,7 @@
<div class="box"> <div class="box">
<a v-for="(item, index) in latestList" :key="index" class="item flexacenter vuehide" :href="'/details/' + item.uniqid" target="_blank"> <a v-for="(item, index) in latestList" :key="index" class="item flexacenter vuehide" :href="'/details/' + item.uniqid" target="_blank">
<div class="dot dot-green"></div> <div class="dot dot-green"></div>
<div class="text one-line-display">{{ item.title }}</div> <div class="text one-line-display">{{ item.title || item.content }}</div>
</a> </a>
</div> </div>
</div> </div>
@@ -31,7 +31,7 @@
<div class="box"> <div class="box">
<a v-for="(item, index) in topList" :key="index" class="item flexacenter vuehide" :href="'/details/' + item.uniqid" target="_blank"> <a v-for="(item, index) in topList" :key="index" class="item flexacenter vuehide" :href="'/details/' + item.uniqid" target="_blank">
<div class="dot"></div> <div class="dot"></div>
<div class="text one-line-display">{{ item.title }}</div> <div class="text one-line-display">{{ item.title || item.content }}</div>
</a> </a>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,19 @@
// my-component.js
// 引入全局 Vue 对象(因在 HTML 中通过 script 引入Vue 已挂载到 window
const { defineComponent, ref, onMounted, onUnmounted } = Vue;
// 定义组件(直接使用模板)
export const loadBox = defineComponent({
name: "load-box",
props: {
loading: {
type: String,
default: "",
},
},
setup(props) {
return { };
},
template: `<div class="list-load-box flexcenter" :class="{'show': loading}"><img class="list-load-icon" src="/img/load-icon.svg" /><div class="list-load-text">加载中</div></div>`,
});

View File

@@ -209,6 +209,7 @@
border-radius: 10px; border-radius: 10px;
padding-left: 95px; padding-left: 95px;
padding-right: 40px; padding-right: 40px;
padding-bottom: 50px;
} }
#homepage-other .matter .matter-content .list-area .classify { #homepage-other .matter .matter-content .list-area .classify {
padding-top: 39px; padding-top: 39px;
@@ -254,7 +255,6 @@
border: 1px solid #e9eef2; border: 1px solid #e9eef2;
border-radius: 10px; border-radius: 10px;
flex-direction: column; flex-direction: column;
margin-bottom: 50px;
} }
#homepage-other .matter .matter-content .list-area .empty .empty-icon { #homepage-other .matter .matter-content .list-area .empty .empty-icon {
width: 80px; width: 80px;

View File

@@ -40,7 +40,7 @@
padding-top: 39px; padding-top: 39px;
padding-bottom: 40px; padding-bottom: 40px;
margin-right: 20px; margin-right: 20px;
.avatar { .avatar {
width: 120px; width: 120px;
height: 120px; height: 120px;
@@ -243,6 +243,7 @@
border-radius: 10px; border-radius: 10px;
padding-left: 95px; padding-left: 95px;
padding-right: 40px; padding-right: 40px;
padding-bottom: 50px;
.classify { .classify {
padding-top: 39px; padding-top: 39px;
@@ -296,7 +297,7 @@
border: 1px solid rgba(233, 238, 242, 1); border: 1px solid rgba(233, 238, 242, 1);
border-radius: 10px; border-radius: 10px;
flex-direction: column; flex-direction: column;
margin-bottom: 50px; // margin-bottom: 50px;
.empty-icon { .empty-icon {
width: 80px; width: 80px;

View File

@@ -15,7 +15,10 @@
#appIndex .header-content-box .header-content-left .adv-list .adv-item:not(:last-child) { #appIndex .header-content-box .header-content-left .adv-list .adv-item:not(:last-child) {
margin-right: 12px; margin-right: 12px;
} }
#appIndex .header-content-box .header-content-left .adv-list .adv-item .adv-img { #appIndex .header-content-box .header-content-left .adv-list .adv-item a {
display: block;
}
#appIndex .header-content-box .header-content-left .adv-list .adv-item img {
width: 468px; width: 468px;
height: 60px; height: 60px;
border-radius: 10px; border-radius: 10px;
@@ -283,13 +286,16 @@
height: 16px; height: 16px;
margin-right: 6px; margin-right: 6px;
} }
#appIndex .header-content-box .header-content-right .adv-broadside { #appIndex .header-content-box .header-content-right .adv {
width: 240px; width: 240px;
height: 140px; height: 140px;
margin-bottom: 10px; margin-bottom: 10px;
display: block; display: block;
} }
#appIndex .header-content-box .header-content-right .adv-broadside .adv-broadside-img { #appIndex .header-content-box .header-content-right .adv a {
display: block;
}
#appIndex .header-content-box .header-content-right .adv img {
width: 240px; width: 240px;
height: 140px; height: 140px;
border-radius: 10px; border-radius: 10px;

View File

@@ -18,7 +18,10 @@
&:not(:last-child) { &:not(:last-child) {
margin-right: 12px; margin-right: 12px;
} }
.adv-img { a {
display: block;
}
img {
width: 468px; width: 468px;
height: 60px; height: 60px;
border-radius: 10px; border-radius: 10px;
@@ -340,12 +343,15 @@
} }
} }
.adv-broadside { .adv {
width: 240px; width: 240px;
height: 140px; height: 140px;
margin-bottom: 10px; margin-bottom: 10px;
display: block; display: block;
.adv-broadside-img { a {
display: block;
}
img {
width: 240px; width: 240px;
height: 140px; height: 140px;
border-radius: 10px; border-radius: 10px;

View File

@@ -86,6 +86,59 @@ body {
font-size: 13px; font-size: 13px;
color: #aaaaaa; color: #aaaaaa;
} }
.item-box .item-head .anonymous-box {
background-color: #f2f2f2;
border-radius: 30px;
font-size: 14px;
color: #333;
height: 28px;
padding: 0 10px;
cursor: pointer;
margin-right: 15px;
}
.item-box .item-head .circlePen {
border-radius: 50%;
background-color: #f2f2f2;
margin-right: 10px;
width: 28px;
height: 28px;
cursor: pointer;
}
.item-box .item-head .circlePen .icon {
width: 20px;
height: 20px;
}
.item-box .item-head .isPublicityBox {
width: 120px;
background-color: #fff;
position: absolute;
top: 34px;
left: 0;
border-radius: 8px;
box-shadow: 0px 0px 9px rgba(0, 0, 0, 0.2);
z-index: 89;
}
.item-box .item-head .isPublicityBox .isPublicity-item {
height: 40px;
line-height: 40px;
text-align: center;
padding: 0 10px;
color: #555555;
font-size: 16px;
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
}
.item-box .item-head .isPublicityBox .isPublicity-item:first-child {
border-bottom: 1px dotted #e3e3e3;
}
.item-box .item-head .isPublicityBox .isPublicity-item.green {
color: #26d79f;
}
.item-box .item-head .isPublicityBox .isPublicity-item .isPublicityIcon {
width: 12px;
}
.item-box .item-head .view { .item-box .item-head .view {
font-size: 12px; font-size: 12px;
color: #aaaaaa; color: #aaaaaa;
@@ -856,7 +909,7 @@ body {
.side-box .box { .side-box .box {
width: 272px; width: 272px;
background-color: #ffffff; background-color: #ffffff;
border-radius: 8px; border-radius: 0;
} }
.side-box.thread-side-box .box .item { .side-box.thread-side-box .box .item {
padding-top: 16px; padding-top: 16px;
@@ -1021,7 +1074,7 @@ body {
margin-right: 10px; margin-right: 10px;
} }
.side-box.newest-side-box .box .item .dot.dot-green { .side-box.newest-side-box .box .item .dot.dot-green {
background-image: url(https://app.gter.net/image/gter/forum/assets/forum/dot-green.svg); background-image: url(/img/dot-green.svg);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.side-box.newest-side-box .box .item .text { .side-box.newest-side-box .box .item .text {
@@ -1056,7 +1109,7 @@ body {
width: 6px; width: 6px;
height: 6px; height: 6px;
margin-right: 10px; margin-right: 10px;
background-image: url(https://app.gter.net/image/gter/forum/assets/forum/dot-blue.svg); background-image: url(/img/dot-blue.svg);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.side-box.essence-side-box .box .item .text { .side-box.essence-side-box .box .item .text {
@@ -1382,6 +1435,10 @@ body {
padding: 0 15px; padding: 0 15px;
justify-content: space-between; justify-content: space-between;
margin-right: 20px; margin-right: 20px;
transition: all 0.3s;
}
.head-top .input-box.pitch {
border-color: #000;
} }
.head-top .input-box .input { .head-top .input-box .input {
border: none; border: none;
@@ -1392,7 +1449,7 @@ body {
.head-top .input-box .icon { .head-top .input-box .icon {
width: 18px; width: 18px;
height: 18px; height: 18px;
margin-left: 15rpx; margin-left: 15px;
cursor: pointer; cursor: pointer;
} }
.head-top .sign-in { .head-top .sign-in {
@@ -1593,3 +1650,44 @@ td {
.templateValue { .templateValue {
display: none; display: none;
} }
.list-load-box {
width: 100%;
height: 0;
background-color: #ffffff;
border: 0 solid #e9eef2;
border-radius: 10px;
flex-direction: column;
transition: all 0.3s ease-in-out;
overflow: hidden;
}
.list-load-box.show {
height: 100px;
border-width: 1px;
}
.list-load-box.show .list-load-icon {
width: 30px;
height: 30px;
}
.list-load-box.show .list-load-text {
font-size: 14px;
}
.list-load-box .list-load-icon {
width: 0;
height: 0;
animation: loadingRotate 1s linear infinite;
transition: all 0.3s ease-in-out;
}
.list-load-box .list-load-text {
color: #999999;
font-size: 0;
margin-top: 6px;
transition: all 0.3s ease-in-out;
}
@keyframes loadingRotate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}

View File

@@ -102,6 +102,67 @@ body {
color: #aaaaaa; color: #aaaaaa;
} }
.anonymous-box {
background-color: #f2f2f2;
border-radius: 30px;
font-size: 14px;
color: #333;
height: 28px;
padding: 0 10px;
cursor: pointer;
margin-right: 15px;
}
.circlePen {
border-radius: 50%;
background-color: #f2f2f2;
margin-right: 10px;
width: 28px;
height: 28px;
cursor: pointer;
.icon {
width: 20px;
height: 20px;
}
}
.isPublicityBox {
width: 120px;
background-color: #fff;
position: absolute;
top: 34px;
left: 0;
border-radius: 8px;
box-shadow: 0px 0px 9px rgba(0, 0, 0, 0.2);
z-index: 89;
.isPublicity-item {
height: 40px;
line-height: 40px;
text-align: center;
padding: 0 10px;
color: #555555;
font-size: 16px;
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
&:first-child {
border-bottom: 1px dotted #e3e3e3;
}
&.green {
color: #26d79f;
}
.isPublicityIcon {
width: 12px;
}
}
}
.view { .view {
font-size: 12px; font-size: 12px;
color: #aaaaaa; color: #aaaaaa;
@@ -1021,7 +1082,7 @@ body {
.side-box .box { .side-box .box {
width: 272px; width: 272px;
background-color: #ffffff; background-color: #ffffff;
border-radius: 8px; border-radius: 0;
} }
.side-box.thread-side-box .box .item { .side-box.thread-side-box .box .item {
@@ -1220,7 +1281,7 @@ body {
} }
.side-box.newest-side-box .box .item .dot.dot-green { .side-box.newest-side-box .box .item .dot.dot-green {
background-image: url(https://app.gter.net/image/gter/forum/assets/forum/dot-green.svg); background-image: url(/img/dot-green.svg);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
@@ -1263,7 +1324,7 @@ body {
width: 6px; width: 6px;
height: 6px; height: 6px;
margin-right: 10px; margin-right: 10px;
background-image: url(https://app.gter.net/image/gter/forum/assets/forum/dot-blue.svg); background-image: url(/img/dot-blue.svg);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
@@ -1650,6 +1711,11 @@ body {
padding: 0 15px; padding: 0 15px;
justify-content: space-between; justify-content: space-between;
margin-right: 20px; margin-right: 20px;
transition: all 0.3s;
&.pitch {
border-color: #000;
}
.input { .input {
border: none; border: none;
@@ -1661,7 +1727,7 @@ body {
.icon { .icon {
width: 18px; width: 18px;
height: 18px; height: 18px;
margin-left: 15rpx; margin-left: 15px;
cursor: pointer; cursor: pointer;
} }
} }
@@ -1882,7 +1948,6 @@ td {
height: 8px; height: 8px;
} }
.t_r { .t_r {
-moz-border-radius: 0 8px 0 0; -moz-border-radius: 0 8px 0 0;
-webkit-border-radius: 0 8px 0 0; -webkit-border-radius: 0 8px 0 0;
@@ -1891,4 +1956,53 @@ td {
.templateValue { .templateValue {
display: none; display: none;
} }
.list-load-box {
width: 100%;
height: 0;
background-color: #ffffff;
border: 0 solid #e9eef2;
border-radius: 10px;
flex-direction: column;
transition: all 0.3s ease-in-out;
overflow: hidden;
&.show {
height: 100px;
border-width: 1px;
.list-load-icon {
width: 30px;
height: 30px;
}
.list-load-text {
font-size: 14px;
}
}
.list-load-icon {
width: 0;
height: 0;
animation: loadingRotate 1s linear infinite;
transition: all 0.3s ease-in-out;
}
.list-load-text {
color: #999999;
font-size: 0;
margin-top: 6px;
transition: all 0.3s ease-in-out;
}
}
@keyframes loadingRotate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}

11
img/coin-bj.svg Normal file

File diff suppressed because one or more lines are too long

BIN
img/coin-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

13
img/dot-blue.svg Normal file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="6px" height="6px" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient gradientUnits="userSpaceOnUse" x1="15" y1="71.06" x2="15" y2="77" id="LinearGradient670">
<stop id="Stop671" stop-color="#ccddf7" offset="0" />
<stop id="Stop672" stop-color="#3889ff" offset="1" />
</linearGradient>
</defs>
<g transform="matrix(1 0 0 1 -12 -71 )">
<path d="M 15 71 C 16.68 71 18 72.32 18 74 C 18 75.68 16.68 77 15 77 C 13.32 77 12 75.68 12 74 C 12 72.32 13.32 71 15 71 Z " fill-rule="nonzero" fill="url(#LinearGradient670)" stroke="none" />
<path d="M 15 71.5 C 16.4 71.5 17.5 72.6 17.5 74 C 17.5 75.4 16.4 76.5 15 76.5 C 13.6 76.5 12.5 75.4 12.5 74 C 12.5 72.6 13.6 71.5 15 71.5 Z " stroke-width="1" stroke="#797979" fill="none" />
</g>
</svg>

13
img/dot-green.svg Normal file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="6px" height="6px" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient gradientUnits="userSpaceOnUse" x1="1597" y1="6772.06" x2="1597" y2="6778" id="LinearGradient682">
<stop id="Stop683" stop-color="#d3f2d9" offset="0" />
<stop id="Stop684" stop-color="#72db86" offset="1" />
</linearGradient>
</defs>
<g transform="matrix(1 0 0 1 -1594 -6772 )">
<path d="M 1597 6772 C 1598.68 6772 1600 6773.32 1600 6775 C 1600 6776.68 1598.68 6778 1597 6778 C 1595.32 6778 1594 6776.68 1594 6775 C 1594 6773.32 1595.32 6772 1597 6772 Z " fill-rule="nonzero" fill="url(#LinearGradient682)" stroke="none" />
<path d="M 1597 6772.5 C 1598.4 6772.5 1599.5 6773.6 1599.5 6775 C 1599.5 6776.4 1598.4 6777.5 1597 6777.5 C 1595.6 6777.5 1594.5 6776.4 1594.5 6775 C 1594.5 6773.6 1595.6 6772.5 1597 6772.5 Z " stroke-width="1" stroke="#797979" fill="none" />
</g>
</svg>

1
img/load-icon.svg Normal file
View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1762325523447" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6416" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M896 463m-128 0a128 128 0 1 0 256 0 128 128 0 1 0-256 0Z" p-id="6417" fill="#999999"></path><path d="M432 96m-96 0a96 96 0 1 0 192 0 96 96 0 1 0-192 0Z" p-id="6418" fill="#999999"></path><path d="M80 512m-80 0a80 80 0 1 0 160 0 80 80 0 1 0-160 0Z" p-id="6419" fill="#999999"></path><path d="M352 832c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64zM853.8 885.8c-28.1 28.1-65 42.2-101.8 42.2s-73.7-14.1-101.8-42.2c-56.2-56.2-56.2-147.4 0-203.6 28.1-28.1 65-42.2 101.8-42.2s73.7 14.1 101.8 42.2c56.3 56.2 56.3 147.4 0 203.6zM829.9 258.4c-22.2 22.2-51.4 33.4-80.5 33.4-29.2 0-58.3-11.1-80.5-33.4-44.5-44.5-44.5-116.6 0-161C691.1 75.1 720.2 64 749.4 64c29.1 0 58.3 11.1 80.5 33.4 44.5 44.4 44.5 116.5 0 161zM246.4 294.5c-17.2 17.2-39.7 25.8-62.3 25.8-22.5 0-45.1-8.6-62.3-25.8-34.4-34.4-34.4-90.2 0-124.6 17.2-17.2 39.7-25.8 62.3-25.8 22.5 0 45.1 8.6 62.3 25.8 34.4 34.4 34.4 90.2 0 124.6zM218.8 794.9c-14.1 14-32.5 21.1-50.9 21.1s-36.8-7-50.8-21.1c-28.1-28.1-28.1-73.6 0-101.7 14-14 32.5-21.1 50.8-21.1 18.4 0 36.8 7 50.9 21.1 28.1 28.1 28.1 73.6 0 101.7z" p-id="6420" fill="#999999"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
img/petal1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 B

BIN
img/petal2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 B

BIN
img/petal3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 B

22
img/sign-go.svg Normal file
View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="30px" height="30px" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient gradientUnits="userSpaceOnUse" x1="171" y1="1" x2="171" y2="44" id="LinearGradient644">
<stop id="Stop645" stop-color="#fbfff4" offset="0" />
<stop id="Stop646" stop-color="#fbcdc4" offset="1" />
</linearGradient>
<filter x="156px" y="16px" width="30px" height="30px" filterUnits="userSpaceOnUse" id="filter647">
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetInner" />
<feGaussianBlur stdDeviation="1" in="shadowOffsetInner" result="shadowGaussian" />
<feComposite in2="shadowGaussian" operator="atop" in="SourceAlpha" result="shadowComposite" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.349019607843137 0 " in="shadowComposite" />
</filter>
<g id="widget648">
<path d="M 171 18 C 178.28 18 184 23.72 184 31 C 184 38.28 178.28 44 171 44 C 163.72 44 158 38.28 158 31 C 158 23.72 163.72 18 171 18 Z " fill-rule="nonzero" fill="url(#LinearGradient644)" stroke="none" />
</g>
</defs>
<g transform="matrix(1 0 0 1 -156 -16 )">
<use xlink:href="#widget648" filter="url(#filter647)" />
<use xlink:href="#widget648" />
</g>
</svg>

BIN
img/sign-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

13
img/sign-in-bj.svg Normal file

File diff suppressed because one or more lines are too long

7
img/u1829.svg Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="8px" height="8px" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1 0 0 1 -1317 -4719 )">
<path d="M 1321 4720 C 1322.68 4720 1324 4721.32 1324 4723 C 1324 4724.68 1322.68 4726 1321 4726 C 1319.32 4726 1318 4724.68 1318 4723 C 1318 4721.32 1319.32 4720 1321 4720 Z " fill-rule="nonzero" fill="#fddf6d" stroke="none" />
<path d="M 1321 4720 C 1322.68 4720 1324 4721.32 1324 4723 C 1324 4724.68 1322.68 4726 1321 4726 C 1319.32 4726 1318 4724.68 1318 4723 C 1318 4721.32 1319.32 4720 1321 4720 Z " stroke-width="2" stroke="#aaaaaa" fill="none" />
</g>
</svg>

View File

@@ -1,273 +1,278 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>论坛首页</title>
<link rel="stylesheet" href="./css/public.css" />
<link rel="stylesheet" href="./css/index.css" />
<script src="./js/vue.global.js"></script>
<style>
[v-cloak] {
display: none;
}
</style>
</head>
<body> <head>
<div class="container" id="appIndex" v-cloak> <meta charset="UTF-8" />
<head-top></head-top> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>论坛首页</title>
<link rel="stylesheet" href="./css/public.css" />
<link rel="stylesheet" href="./css/index.css" />
<script src="./js/vue.global.js"></script>
<style>
[v-cloak] {
display: none;
}
</style>
</head>
<div class="header-content-box flexflex"> <body>
<div class="header-content-left"> <div class="container" id="appIndex" v-cloak>
<div class="adv-list flexacenter"> <head-top></head-top>
<a class="adv-item" target="_blank">
<img class="adv-img" src="https://o.x-php.com/bbs/common/cf/144405a5pqst6fakct81t8.gif" /> <div class="header-content-box flexflex">
</a> <div class="header-content-left">
<a class="adv-item" target="_blank"> <div class="adv-list flexacenter">
<img class="adv-img" src="https://o.x-php.com/bbs/common/cf/144405a5pqst6fakct81t8.gif" /> <a class="adv-item" target="_blank">
</a> <img class="adv-img" src="https://o.x-php.com/bbs/common/cf/144405a5pqst6fakct81t8.gif" />
</div> </a>
<!-- 话题和精选 --> <a class="adv-item" target="_blank">
<div class="topic-and-selectives flexflex"> <img class="adv-img" src="https://o.x-php.com/bbs/common/cf/144405a5pqst6fakct81t8.gif" />
<div class="topic-box"> </a>
<div class="head-top flexcenter"> </div>
<img class="icon" src="https://app.gter.net/image/miniApp/offer/well-white.svg" /> <!-- 话题和精选 -->
<div class="text">话题</div> <div class="topic-and-selectives flexflex">
</div> <div class="topic-box">
<div class="topic-head flexflex" bind:tap="goDetails" data-uniqid="{{ ongoingbj.uniqid }}"> <div class="head-top flexcenter">
<div class="title one-line-display">{{ ongoingbj.title }}</div> <img class="icon" src="https://app.gter.net/image/miniApp/offer/well-white.svg" />
<div class="hint one-line-display">{{ ongoingbj.description }}</div> <div class="text">话题</div>
<div class="people flexacenter"> </div>
<div class="left flexacenter"> <div class="topic-head flexflex" bind:tap="goDetails" data-uniqid="{{ ongoingbj.uniqid }}">
<div class="number">{{ ongoingbj.comments }}</div> <div class="title one-line-display">{{ ongoingbj.title }}</div>
<div class="text">人正在讨论</div> <div class="hint one-line-display">{{ ongoingbj.description }}</div>
</div> <div class="people flexacenter">
<div class="right flexacenter"> <div class="left flexacenter">
<div class="item flexcenter" v-for="(item, index) in ongoingbj.commentUser" :key="index" :style="{zIndex: 7 - index }"> <div class="number">{{ ongoingbj.comments }}</div>
<img class="img" :src="item.avatar" /> <div class="text">人正在讨论</div>
</div> </div>
<div class="right flexacenter">
<div class="item flexcenter" v-for="(item, index) in ongoingbj.commentUser" :key="index" :style="{zIndex: 7 - index }">
<img class="img" :src="item.avatar" />
</div> </div>
</div> </div>
</div> </div>
<div class="topic-list">
<a class="item flexacenter" v-for="(item, index) in pastList" :key="index" :href="'http://14.22.79.19:9551/?tpl=forum/details&uniqid=' + item.uniqid" target="_blank">
<img class="img" src="https://app.gter.net/image/miniApp/offer/well-yellow.svg" />
<div class="text one-line-display flex1">{{ item.title }}</div>
</a>
</div>
</div> </div>
<div class="topic-list">
<div class="selectives-box"> <a class="item flexacenter" v-for="(item, index) in pastList" :key="index" :href="'http://14.22.79.19:9551/?tpl=forum/details&uniqid=' + item.uniqid" target="_blank">
<div class="head-top flexcenter"> <img class="img" src="https://app.gter.net/image/miniApp/offer/well-yellow.svg" />
<img class="icon" src="https://app.gter.net/image/miniApp/offer/handpick-icon.png" /> <div class="text one-line-display flex1">{{ item.title }}</div>
<div class="text">精选</div> </a>
</div>
<div class="list flexflex">
<a class="item flexacenter" v-for="(item, index) in topicHandpickedList" :key="index" :href="'http://14.22.79.19:9551/?tpl=forum/details&uniqid=' + item.uniqid" target="_blank">
<div class="dot"></div>
<div class="text one-line-display">{{ item.title }}</div>
</a>
</div>
</div> </div>
</div> </div>
<div class="header-left-bottom-box flexflex"> <div class="selectives-box">
<a class="adv flexacenter" data-x-event="bbsindexslide" href="https://bbs.gter.net/thread-1663824-1-1.html" title="26Fall祈福求offer得offer" target="_blank"> <div class="head-top flexcenter">
<img class="adv-icon" src="https://o.x-php.com/Zvt57TuJSUvkyhw-xG_Y2l-U_potcXiB1NFX9ddrB-ebU2ybYKMuA2kGH_7R-9lU990IXj3X-Q7x4Cg0NDI5" alt="26Fall祈福求offer得offer" /> <img class="icon" src="https://app.gter.net/image/miniApp/offer/handpick-icon.png" />
</a> <div class="text">精选</div>
<div class="list">
<div class="item flexacenter" v-for="(item, index) in 4" :key="index">
<div class="icon dot-gray"></div>
<a class="one-line-display text flex1" href="https://offer.gter.net/details/XynvPnSnX1KL" target="_blank">26Fall-香港理工大学 MSc Offer</a>
</div>
</div> </div>
<div class="list list2"> <div class="list flexflex">
<div class="item flexacenter" v-for="(item, index) in 4" :key="index"> <a class="item flexacenter" v-for="(item, index) in topicHandpickedList" :key="index" :href="'http://14.22.79.19:9551/?tpl=forum/details&uniqid=' + item.uniqid" target="_blank">
<div class="icon dot-gray"></div> <div class="dot"></div>
<a class="one-line-display text flex1" href="https://offer.gter.net/details/y9KbiuzHXbmr" target="_blank">26Fall-香港科技大学 MSc Offer</a> <div class="text one-line-display">{{ item.title }}</div>
</div> </a>
</div> </div>
</div> </div>
</div> </div>
<div class="header-content-right"> <div class="header-left-bottom-box flexflex">
<div class="post-entrance"> <a class="adv flexacenter" data-x-event="bbsindexslide" href="https://bbs.gter.net/thread-1663824-1-1.html" title="26Fall祈福求offer得offer" target="_blank">
<div class="entrance-top flexacenter"><img class="icon" src="./img/forum.png" />我要发帖</div> <img class="adv-icon" src="https://o.x-php.com/Zvt57TuJSUvkyhw-xG_Y2l-U_potcXiB1NFX9ddrB-ebU2ybYKMuA2kGH_7R-9lU990IXj3X-Q7x4Cg0NDI5" alt="26Fall祈福求offer得offer" />
<div class="entrance-bottom flexacenter">
<a class="item flexcenter" href="https://offer.gter.net/post" target="_blank" style="position: relative">
<img class="icon" src="./img/offer.svg" style="width: 16px" />
<span class="text">报Offer</span>
</a>
<a class="item flexcenter" href="https://offer.gter.net/post/summary" target="_blank" style="position: relative">
<img class="icon" src="./img/summarize.png" style="width: 16px" />
<span class="text">写总结</span>
</a>
<a class="item flexcenter" href="https://interviewexperience.gter.net/publish" target="_blank" style="position: relative">
<img class="icon" src="./img/mj.png" style="width: 16px" />
<span class="text">写面经</span>
</a>
<a class="item flexcenter" href="https://vote.gter.net/publish" target="_blank" style="position: relative">
<img class="icon" src="./img/vote.svg" style="width: 16px" />
<span class="text">发起投票</span>
</a>
</div>
</div>
<a class="adv-broadside" ref="custom_2AdvRef">
<img class="adv-broadside-img" src="https://o.x-php.com/bbs/common/cf/152158dpf5eh7pqpaealiq.gif" />
</a> </a>
<div class="list">
<div class="group-box"> <div class="item flexacenter" v-for="(item, index) in 4" :key="index">
<div class="group flexflex"> <div class="icon dot-gray"></div>
<div class="group-item flexcenter" v-for="(item, index) in popList" :key="index"> <a class="one-line-display text flex1" href="https://offer.gter.net/details/XynvPnSnX1KL" target="_blank">26Fall-香港理工大学 MSc Offer</a>
<div class="title">{{ item.title }}</div>
<div class="subtitle">{{ item.subtitle }}</div>
<div class="QRcode-box flexcenter">
<img class="QRcode" :src="item.img" />
<div class="text">微信扫码</div>
</div>
</div>
</div> </div>
</div> </div>
<div class="list list2">
<div class="offer-box" :class="{'small': custom_2AdvRef}" id="offer-box" @mouseover="offerMouseover" @mouseout="offerMouseout"> <div class="item flexacenter" v-for="(item, index) in 4" :key="index">
<div class="offer-list" id="offer-list" ref="offerListRef" :style="{'margin-top': -offerMargin + 'px'}"> <div class="icon dot-gray"></div>
<a class="item flexflex" :href="item['url']" target="_blank" v-cloak v-for="(item, index) in offerlist" :key="index"> <a class="one-line-display text flex1" href="https://offer.gter.net/details/y9KbiuzHXbmr" target="_blank">26Fall-香港科技大学 MSc Offer</a>
<div class="avatar" :style="{backgroundImage: `url(${item['avatar']})`}"></div>
<div class="">
<div class="condition one-line-display">{{ item["date"] }} {{ item['type'] }}</div>
<div class="titletitle one-line-display">{{ item["content"] }}</div>
</div>
</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="matter flexflex">
<div class="matter-content flex1">
<!-- 论坛板块列表 -->
<div class="forum-sections-list">
<img class="img" src="./img/sections-left.svg" />
<div class="title">论坛版块</div>
<div class="list">
<template v-for="(item, index) in sectionList" :key="index">
<div class="line flexacenter">
<a class="item flexacenter" v-for="(item, index) in item" :key="index" target="_blank" :href="`/section-index.html?section=${item.uniqid}`">{{ item.name }}</a>
</div>
</template>
</div>
</div>
<item-forum :itemdata="item" v-for="(item, index) in list" :key="index"></item-forum> <div class="header-content-right">
<div class="post-entrance">
<div class="entrance-top flexacenter"><img class="icon" src="./img/forum.png" />我要发帖</div>
<div class="entrance-bottom flexacenter">
<a class="item flexcenter" href="https://offer.gter.net/post" target="_blank" style="position: relative">
<img class="icon" src="./img/offer.svg" style="width: 16px" />
<span class="text">报Offer</span>
</a>
<a class="item flexcenter" href="https://offer.gter.net/post/summary" target="_blank" style="position: relative">
<img class="icon" src="./img/summarize.png" style="width: 16px" />
<span class="text">写总结</span>
</a>
<a class="item flexcenter" href="https://interviewexperience.gter.net/publish" target="_blank" style="position: relative">
<img class="icon" src="./img/mj.png" style="width: 16px" />
<span class="text">写面经</span>
</a>
<a class="item flexcenter" href="https://vote.gter.net/publish" target="_blank" style="position: relative">
<img class="icon" src="./img/vote.svg" style="width: 16px" />
<span class="text">发起投票</span>
</a>
</div>
</div> </div>
<div class="sidebar">
<a class="adv" href="" target="_blank">
<img class="adv-icon" src="https://o.x-php.com/bbs/common/cf/1709075xdbbbvjd8cbxvdd.jpg" alt="26Fall祈福求offer得offer" />
</a>
<a class="adv" href="" target="_blank">
<img class="adv-icon" src="https://o.x-php.com/bbs/common/cf/1709075xdbbbvjd8cbxvdd.jpg" alt="26Fall祈福求offer得offer" />
</a>
<!-- offer --> <a class="adv-broadside" ref="custom_2AdvRef">
<div class="offer-side-box side-box" v-if="offer.length != 0"> <img class="adv-broadside-img" src="https://o.x-php.com/bbs/common/cf/152158dpf5eh7pqpaealiq.gif" />
<div class="side-header flexacenter"> </a>
<div class="left flexacenter">
<img class="header-icon" src="./img/offer-index-icon.png" /> <div class="group-box">
<div class="title">Offer</div> <div class="group flexflex">
<div class="group-item flexcenter" v-for="(item, index) in popList" :key="index">
<div class="title">{{ item.title }}</div>
<div class="subtitle">{{ item.subtitle }}</div>
<div class="QRcode-box flexcenter">
<img class="QRcode" :src="item.img" />
<div class="text">微信扫码</div>
</div> </div>
<a class="more flexacenter" href="https://offer.gter.net" target="_blank">
<span>more</span>
<img class="more-icon" src="./img/right-arrow-black.svg" />
</a>
</div>
<div class="box">
<a class="item flexflex" v-cloak v-for="item in offer" :key="item" :href="'/details/' + item['uniqid']" target="_blank">
<img class="school-img" :src="item.data['schoollogo']" />
<div class="school-detail flex1 flexflex">
<div class="school-name one-line-display">{{ item.data['schoolname'] }}</div>
<div class="school-brief one-line-display">{{ item.data['professional'] }}</div>
<div class="school-offer flexacenter">
<span>{{ item.data['degree'] }}</span>
<span class="long-string">|</span>
<span>{{ item.data['semester'] }}</span>
<span class="long-string">|</span>
<span>{{ item.data['apply_results_text'] }}</span>
</div>
</div>
</a>
<a class="add-btn flexcenter" style="position: relative" href="https://offer.gter.net/post" target="_blank" v-cloak>
<img class="add-icon" src="./img/add-btn-black.svg" />
<div>报Offer</div>
<div v-if="realname == 0 && userInfo.uin > 0" class="open-attest-btn" @click.prevent="openAttest"></div>
</a>
</div> </div>
</div> </div>
</div>
<!-- vote --> <div class="offer-box" :class="{'small': custom_2AdvRef}" id="offer-box" @mouseover="offerMouseover" @mouseout="offerMouseout">
<div class="vote-side-box side-box" v-if="vote.length != 0"> <div class="offer-list" id="offer-list" ref="offerListRef" :style="{'margin-top': -offerMargin + 'px'}">
<div class="side-header flexacenter"> <a class="item flexflex" :href="item['url']" target="_blank" v-cloak v-for="(item, index) in offerlist" :key="index">
<div class="left flexacenter"> <div class="avatar" :style="{backgroundImage: `url(${item['avatar']})`}"></div>
<img class="header-icon" src="./img/vote-index-icon.png" /> <div class="">
<div class="title">投票</div> <div class="condition one-line-display">{{ item["date"] }} {{ item['type'] }}</div>
<div class="titletitle one-line-display">{{ item["content"] }}</div>
</div> </div>
<a class="more flexacenter" target="_blank" href="https://vote.gter.net"> </a>
<span>more</span>
<img class="more-icon" src="./img/right-arrow-black.svg" />
</a>
</div>
<div class="box">
<a class="item flexflex" v-cloak v-for="item in vote" :key="item" target="_blank" :href="'https://vote.gter.net/details/' + item['uniqid']">
<div class="name one-line-display">{{item['title']}}</div>
<div class="brief">{{ item['message'] }}</div>
</a>
<a class="add-btn flexcenter" style="position: relative" v-cloak target="_blank" href="https://vote.gter.net/publish">
<img class="add-icon" src="./img/add-btn-black.svg" />
<div>发起投票</div>
<div v-if="realname == 0 && userInfo.uin > 0" class="open-attest-btn" @click.prevent="openAttest"></div>
</a>
</div>
</div> </div>
<!-- mj -->
<div class="interviewexperience-side-box side-box" v-if="interviewexperience.length != 0">
<div class="side-header flexacenter">
<div class="left flexacenter">
<img class="header-icon" src="./img/mj-index-icon.png" />
<div class="title">面经</div>
</div>
<a class="more flexacenter" href="https://interviewexperience.gter.net/" target="_blank">
<span>more</span>
<img class="more-icon" src="./img/right-arrow-black.svg" />
</a>
</div>
<div class="box">
<a class="item flexflex" v-cloak v-for="(item,index) in interviewexperience" :key="item" :href="'https://interviewexperience.gter.net/details/' + item['uniqid']" target="_blank">
<div class="school one-line-display">{{ item.data['schoolname'] }}</div>
<div class="major one-line-display" v-if="item.data['profession']">{{ item.data['profession'] }}</div>
<div class="info">
<img class="icon" :src="item.user['avatar']" />
<span class="text">{{ item['content'] }}</span>
</div>
</a>
<a class="add-btn flexcenter" style="position: relative" href="https://interviewexperience.gter.net/publish" target="_blank" v-cloak>
<img class="add-icon" src="./img/add-btn-black.svg" />
<div>写面经</div>
<div v-if="realname == 0 && userInfo.uin > 0" class="open-attest-btn" @click.prevent="openAttest"></div>
</a>
</div>
</div>
<!-- newest 最新 -->
<latest-list boxtype="newest"></latest-list>
<latest-list boxtype="essence"></latest-list>
</div> </div>
</div> </div>
</div> </div>
<div class="matter flexflex">
<div class="matter-content flex1">
<!-- 论坛板块列表 -->
<div class="forum-sections-list">
<img class="img" src="./img/sections-left.svg" />
<div class="title">论坛版块</div>
<div class="list">
<template v-for="(item, index) in sectionList" :key="index">
<div class="line flexacenter">
<a class="item flexacenter" v-for="(item, index) in item" :key="index" target="_blank" :href="`/section-index.html?section=${item.uniqid}`">{{ item.name }}</a>
</div>
</template>
</div>
</div>
<div class="list-load-box flexcenter">
<img class="list-load-icon" src="./img/load-icon.svg" />
<div class="list-load-text">加载中</div>
</div>
<item-forum :itemdata="item" v-for="(item, index) in list" :key="index"></item-forum>
</div>
<div class="sidebar">
<a class="adv" href="" target="_blank">
<img class="adv-icon" src="https://o.x-php.com/bbs/common/cf/1709075xdbbbvjd8cbxvdd.jpg" alt="26Fall祈福求offer得offer" />
</a>
<a class="adv" href="" target="_blank">
<img class="adv-icon" src="https://o.x-php.com/bbs/common/cf/1709075xdbbbvjd8cbxvdd.jpg" alt="26Fall祈福求offer得offer" />
</a>
<script src="./js/axios.min.js"></script> <!-- offer -->
<script src="./js/public.js"></script> <div class="offer-side-box side-box" v-if="offer.length != 0">
<script src="./js/scrolltext.js"></script> <div class="side-header flexacenter">
<script type="module" src="./js/index.js"></script> <div class="left flexacenter">
</body> <img class="header-icon" src="./img/offer-index-icon.png" />
</html> <div class="title">Offer</div>
</div>
<a class="more flexacenter" href="https://offer.gter.net" target="_blank">
<span>more</span>
<img class="more-icon" src="./img/right-arrow-black.svg" />
</a>
</div>
<div class="box">
<a class="item flexflex" v-cloak v-for="item in offer" :key="item" :href="'/details/' + item['uniqid']" target="_blank">
<img class="school-img" :src="item.data['schoollogo']" />
<div class="school-detail flex1 flexflex">
<div class="school-name one-line-display">{{ item.data['schoolname'] }}</div>
<div class="school-brief one-line-display">{{ item.data['professional'] }}</div>
<div class="school-offer flexacenter">
<span>{{ item.data['degree'] }}</span>
<span class="long-string">|</span>
<span>{{ item.data['semester'] }}</span>
<span class="long-string">|</span>
<span>{{ item.data['apply_results_text'] }}</span>
</div>
</div>
</a>
<a class="add-btn flexcenter" style="position: relative" href="https://offer.gter.net/post" target="_blank" v-cloak>
<img class="add-icon" src="./img/add-btn-black.svg" />
<div>报Offer</div>
<div v-if="realname == 0 && userInfo.uin > 0" class="open-attest-btn" @click.prevent="openAttest"></div>
</a>
</div>
</div>
<!-- vote -->
<div class="vote-side-box side-box" v-if="vote.length != 0">
<div class="side-header flexacenter">
<div class="left flexacenter">
<img class="header-icon" src="./img/vote-index-icon.png" />
<div class="title">投票</div>
</div>
<a class="more flexacenter" target="_blank" href="https://vote.gter.net">
<span>more</span>
<img class="more-icon" src="./img/right-arrow-black.svg" />
</a>
</div>
<div class="box">
<a class="item flexflex" v-cloak v-for="item in vote" :key="item" target="_blank" :href="'https://vote.gter.net/details/' + item['uniqid']">
<div class="name one-line-display">{{item['title']}}</div>
<div class="brief">{{ item['message'] }}</div>
</a>
<a class="add-btn flexcenter" style="position: relative" v-cloak target="_blank" href="https://vote.gter.net/publish">
<img class="add-icon" src="./img/add-btn-black.svg" />
<div>发起投票</div>
<div v-if="realname == 0 && userInfo.uin > 0" class="open-attest-btn" @click.prevent="openAttest"></div>
</a>
</div>
</div>
<!-- mj -->
<div class="interviewexperience-side-box side-box" v-if="interviewexperience.length != 0">
<div class="side-header flexacenter">
<div class="left flexacenter">
<img class="header-icon" src="./img/mj-index-icon.png" />
<div class="title">面经</div>
</div>
<a class="more flexacenter" href="https://interviewexperience.gter.net/" target="_blank">
<span>more</span>
<img class="more-icon" src="./img/right-arrow-black.svg" />
</a>
</div>
<div class="box">
<a class="item flexflex" v-cloak v-for="(item,index) in interviewexperience" :key="item" :href="'https://interviewexperience.gter.net/details/' + item['uniqid']" target="_blank">
<div class="school one-line-display">{{ item.data['schoolname'] }}</div>
<div class="major one-line-display" v-if="item.data['profession']">{{ item.data['profession'] }}</div>
<div class="info">
<img class="icon" :src="item.user['avatar']" />
<span class="text">{{ item['content'] }}</span>
</div>
</a>
<a class="add-btn flexcenter" style="position: relative" href="https://interviewexperience.gter.net/publish" target="_blank" v-cloak>
<img class="add-icon" src="./img/add-btn-black.svg" />
<div>写面经</div>
<div v-if="realname == 0 && userInfo.uin > 0" class="open-attest-btn" @click.prevent="openAttest"></div>
</a>
</div>
</div>
<!-- newest 最新 -->
<latest-list boxtype="newest"></latest-list>
<latest-list boxtype="essence"></latest-list>
</div>
</div>
</div>
<script src="./js/axios.min.js"></script>
<script src="./js/public.js"></script>
<script src="./js/scrolltext.js"></script>
<script type="module" src="./js/index.js"></script>
</body>
</html>

View File

@@ -112,7 +112,7 @@ const appIndex = createApp({
let ongoingbj = ref({}); // 话题数据 let ongoingbj = ref({}); // 话题数据
const getTalkingRecommend = () => { const getTalkingRecommend = () => {
ajaxget("/v2/api/forum/talkingRecommend").then((res) => { ajaxGet("/v2/api/forum/talkingRecommend").then((res) => {
if (res.code != 200) return; if (res.code != 200) return;
let data = res["data"] || []; let data = res["data"] || [];
@@ -128,7 +128,7 @@ const appIndex = createApp({
let topicHandpickedList = ref([]); // 精选列表 let topicHandpickedList = ref([]); // 精选列表
const getTopicHandpicked = (uniqid) => { const getTopicHandpicked = (uniqid) => {
ajaxget(`/v2/api/forum/topicHandpicked?limit=16`).then((res) => { ajaxGet(`/v2/api/forum/topicHandpicked?limit=16`).then((res) => {
if (res.code != 200) return; if (res.code != 200) return;
let data = res["data"] || []; let data = res["data"] || [];
topicHandpickedList.value = data; topicHandpickedList.value = data;
@@ -139,7 +139,7 @@ const appIndex = createApp({
let vote = ref([]); // 面经列表 let vote = ref([]); // 面经列表
let interviewexperience = ref([]); // 面经列表 let interviewexperience = ref([]); // 面经列表
const getTopicLatest = () => { const getTopicLatest = () => {
ajaxget(`/v2/api/forum/getTopicLatest?limit=4`).then((res) => { ajaxGet(`/v2/api/forum/getTopicLatest?limit=4`).then((res) => {
const data = res.data || []; const data = res.data || [];
data.vote.forEach((item) => { data.vote.forEach((item) => {
@@ -238,7 +238,7 @@ const appIndex = createApp({
let sectionList = ref([]); let sectionList = ref([]);
const getSectionList = () => { const getSectionList = () => {
ajaxget("/v2/api/forum/getSectionList").then((res) => { ajaxGet("/v2/api/forum/getSectionList").then((res) => {
if (res.code != 200) return; if (res.code != 200) return;
const data = res.data || []; const data = res.data || [];
let obj = {}; let obj = {};
@@ -267,7 +267,7 @@ const appIndex = createApp({
if (loading || page.value == 0) return; if (loading || page.value == 0) return;
loading = true; loading = true;
// wx.showLoading(); // wx.showLoading();
ajaxget(`/v2/api/forum/topicLists?type=thread&page=${page.value || 1}`) ajaxGet(`/v2/api/forum/topicLists?type=thread&page=${page.value || 1}`)
.then((res) => { .then((res) => {
// wx.hideLoading(); // wx.hideLoading();
if (res.code != 200) return; if (res.code != 200) return;

View File

@@ -221,7 +221,7 @@ const managerHide = (token, state, type = "offer") => {
const isConfirmed = confirm(`确定要${state == 0 ? "隐藏" : "显示"}${obj[type]}吗?`); const isConfirmed = confirm(`确定要${state == 0 ? "隐藏" : "显示"}${obj[type]}吗?`);
if (isConfirmed) { if (isConfirmed) {
ajax(`https://api.gter.net/v2/api/forum/setTopicHide`, { ajax(`/v2/api/forum/setTopicHide`, {
token, token,
hidden: Number(state !== 1), hidden: Number(state !== 1),
}).then((res) => { }).then((res) => {