fix(component): 修复组件名称错误和props类型定义

refactor(component): 重构组件模板结构,移除重复代码

feat(component): 添加可选props支持外部数据传入

style(css): 优化样式布局和响应式设计

fix(js): 修复URL路径处理逻辑和滚动加载问题

feat(search): 新增搜索页推荐内容和空状态处理

chore: 添加新图标资源文件
This commit is contained in:
DESKTOP-RQ919RC\Pc
2025-12-22 19:01:00 +08:00
parent acf03efaf0
commit 43556292d2
26 changed files with 783 additions and 225 deletions

View File

@@ -4,7 +4,7 @@ const { defineComponent, ref, inject, defineAsyncComponent, onMounted } = Vue;
// 定义组件(直接使用模板)
export const helperPop = defineComponent({
name: "item-bottom",
name: "helper-pop",
props: {},
setup(props) {

View File

@@ -1,20 +1,41 @@
// my-component.js
// 引入全局 Vue 对象(因在 HTML 中通过 script 引入Vue 已挂载到 window
const { defineComponent, ref, onMounted } = Vue;
const { defineComponent, ref, onMounted, watch } = Vue;
// 定义组件(直接使用模板)
export const hotSearch = defineComponent({
name: "hot-search",
props: {},
props: {
isnorequestdata: {
type: Boolean,
},
searchlist: {
type: Array,
},
},
setup(props) {
let valueUrl = ref("");
onMounted(() => {
init();
if (!props.isnorequestdata) init();
const valueA = document.querySelector(".valueA");
valueUrl.value = valueA.innerText;
});
const list = ref([]);
watch(
() => props.searchlist,
(newVal) => {
if (newVal) list.value = newVal;
},
{
deep: true, // 核心:开启深度监听(监听对象/数组内部属性变化)
immediate: true, // 可选:组件挂载时立即执行一次回调(根据需求决定)
}
);
const init = () => {
ajaxGet("/v2/api/forum/getHotSearchWords?limit=20").then((res) => {
const data = res.data;
@@ -22,12 +43,10 @@ export const hotSearch = defineComponent({
});
};
const list = ref([]);
return { valueUrl, list };
},
components: {},
template: `<div class="hot-tag" v-if="list.length > 0"> <div class="hot-tag-title"> <img class="icon" :src="valueUrl + '/img/triangle-violet.svg'" /> 热门搜索 </div> <div class="list flexflex"> <a class="item" v-for="item in list" :href="'/search/' + item.keyword" target="_blank">{{ item.keyword }}</a> </div></div>`,
template: `<div class="hot-tag" v-if="list?.length > 0"> <div class="hot-tag-title"> <img class="icon" :src="valueUrl + '/img/triangle-violet.svg'" /> 热门搜索 </div> <div class="list flexflex"> <a class="item" v-for="item in list" :href="'/search/' + item.keyword" target="_blank">{{ item.keyword }}</a> </div></div>`,
});

View File

@@ -1,4 +1,4 @@
<div class="hot-tag" v-if="list.length > 0">
<div class="hot-tag" v-if="list?.length > 0">
<div class="hot-tag-title">
<img class="icon" :src="valueUrl + '/img/triangle-violet.svg'" />
热门搜索

View File

@@ -1,16 +1,23 @@
// my-component.js
// 引入全局 Vue 对象(因在 HTML 中通过 script 引入Vue 已挂载到 window
const { defineComponent, ref, onMounted } = Vue;
const { defineComponent, ref, onMounted, emit, watch } = Vue;
// 定义组件(直接使用模板)
export const hotTag = defineComponent({
name: "hot-tag",
props: {},
props: {
isnorequestdata: {
type: Boolean,
},
taglist: {
type: Array,
},
},
setup(props) {
let valueUrl = ref("");
onMounted(() => {
init();
if (!props.isnorequestdata) init();
const valueA = document.querySelector(".valueA");
valueUrl.value = valueA.innerText;
});
@@ -24,10 +31,22 @@ export const hotTag = defineComponent({
const list = ref([]);
watch(
() => props.taglist,
(newVal) => {
if (newVal) list.value = newVal;
},
{
deep: true, // 核心:开启深度监听(监听对象/数组内部属性变化)
immediate: true, // 可选:组件挂载时立即执行一次回调(根据需求决定)
}
);
return { valueUrl, list };
},
components: {},
template: `<div class="hot-tag" v-if="list.length > 0"> <div class="hot-tag-title"> <img class="icon" :src="valueUrl + '/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="valueUrl + '/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,4 +1,4 @@
<div class="hot-tag" v-if="list.length > 0">
<div class="hot-tag" v-if="list?.length > 0">
<div class="hot-tag-title">
<img class="icon" :src="valueUrl + '/img/triangle-orange.svg'" />
热门标签

View File

@@ -4,7 +4,7 @@ const { defineComponent, ref, inject, defineAsyncComponent, onMounted } = Vue;
// 定义组件(直接使用模板)
export const huddleBox = defineComponent({
name: "item-bottom",
name: "huddle-box",
props: {},
setup(props) {

View File

@@ -17,25 +17,25 @@ export const itemBottom = defineComponent({
setup(props) {
let valueUrl = ref("");
let isMobile = ref(false)
let isMobile = ref(false);
onMounted(() => {
const valueA = document.querySelector(".valueA");
valueUrl.value = valueA.innerText;
isMobile.value = window.isMobile
isMobile.value = window.isMobile;
});
let item = ref({ ...props.itemdata });
let isLogin = inject("isLogin");
let userInfoWin = inject("userInfoWin");
let realname = inject("realname");
let realname = inject("realname", null);
let goLogin = inject("goLogin");
let openAttest = inject("openAttest");
let isLikeGif = ref(false);
let cancelOperate = inject("cancelOperate");
let cancelOperate = inject("cancelOperate", () => {});
const likeClick = () => {
if (realname.value == 0 && userInfoWin.value?.uin > 0) {
@@ -50,7 +50,7 @@ export const itemBottom = defineComponent({
const token = item.value.token || "";
if (["offer", "offer_summary", "interviewexperience"].includes(itemvalue["type"]) && item.value["is_like"]) {
if (["offer", "offer_summary", "interviewexperience"].includes(item.value["type"]) && item.value["is_like"]) {
creationAlertBox("error", "不可取消点赞");
return;
}
@@ -154,5 +154,5 @@ export const itemBottom = defineComponent({
like,
},
template: `<a class="comment flexacenter" v-if="item?.commentreviews && !Array.isArray(item?.commentreviews)" :href="item.url" target="_blank"> <img class="icon" :src="item?.commentreviews?.avatar" /> <div class="text one-line-display">{{ item?.commentreviews?.content || "[图]" }}</div></a><template v-if="item.comment_list?.length != 0"> <a class="comment flexacenter" style="margin-bottom: 15px" v-for="(item, index) in item.comment_list" :key="index" :href="item.url" target="_blank"> <img class="icon" :src="item.avatar" /> <div class="text one-line-display">{{ item.content || "[图]" }}</div> </a></template><div class="bottom flexacenter"> <div class="bottom-item like flexacenter" @click="likeClick()" v-if="item?.type != 'tenement'"> <img v-if="item.is_like" class="icon" :src="valueUrl + '/img/like-red-icon.png'" /> <img v-else class="icon" :src="valueUrl + '/img/like-icon.png'" /> <div class="text">{{ item.likes || "赞" }}</div> </div> <div class="bottom-item flexacenter" @click="collectClick()"> <img v-if="item.is_collect" class="icon" :src="valueUrl + '/img/collect-golden.svg'" /> <img v-else class="icon" :src="valueUrl + '/img/collect-gray.png'" /> <div class="text">{{ item.collections || "收藏" }}</div> </div> <a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank"> <img class="icon" :src="valueUrl + '/img/discuss-icon.png'" /> <div class="text">{{ item.comments || "讨论" }}</div> </a> <a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank"> <img class="icon" :src="valueUrl + '/img/bi-copper-icon.png'" /> <div class="text">{{ item.coins || "投币" }}</div> </a> <!-- 鼠标移入事件 --> <div class="bottom-item share flexacenter" @mouseenter="share" @click="isMobile ? copyLinkClick() : ''"> <img class="icon" :src="valueUrl + '/img/share-gray.png'" style="width: 19px; height: 19px;" /> <div class="text">{{ item.shares || '转发'}}</div> <div class="share-box flexcenter" ref="shareBoxRef"> <div class="share-item flexcenter" @click="copyLinkClick()"> <img class="share-icon" :src="valueUrl + '/img/copy-black-icon.png'" /> <div class="text">复制链接</div> </div> <!-- 鼠标移入 加载二维码 --> <div class="share-item wenxin flexcenter" @mouseenter="showQRcode"> <img class="share-icon" :src="valueUrl + '/img/weixin-icon.png'" /> <div class="text">微信转发</div> <div class="QRcode-box flexcenter" :class="{'right': isright}"> <img v-if="QRcode" class="QRcode" :src="QRcode" /> <div v-else class="QRcode flexcenter"> <img class="load" :src="valueUrl + '/img/load-icon.svg'" /> </div> <div class="text">微信扫码</div> </div> </div> </div> </div></div><like v-if="isLikeGif"></like>`,
template: `<div> <a class="comment flexacenter" v-if="item?.commentreviews && !Array.isArray(item?.commentreviews)" :href="item.url" target="_blank"> <img class="icon" :src="item?.commentreviews?.avatar" /> <div class="text one-line-display">{{ item?.commentreviews?.content || "[图]" }}</div> </a> <template v-if="item.comment_list?.length != 0"> <a class="comment flexacenter" style="margin-bottom: 15px" v-for="(item, index) in item.comment_list" :key="index" :href="item.url" target="_blank"> <img class="icon" :src="item.avatar" /> <div class="text one-line-display">{{ item.content || "[图]" }}</div> </a> </template> <div class="bottom flexacenter"> <div class="bottom-item like flexacenter" @click="likeClick()" v-if="item?.type != 'tenement'"> <img v-if="item.is_like" class="icon" :src="valueUrl + '/img/like-red-icon.png'" /> <img v-else class="icon" :src="valueUrl + '/img/like-icon.png'" /> <div class="text">{{ item.likes || "赞" }}</div> </div> <div class="bottom-item flexacenter" @click="collectClick()"> <img v-if="item.is_collect" class="icon" :src="valueUrl + '/img/collect-golden.svg'" /> <img v-else class="icon" :src="valueUrl + '/img/collect-gray.png'" /> <div class="text">{{ item.collections || "收藏" }}</div> </div> <a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank"> <img class="icon" :src="valueUrl + '/img/discuss-icon.png'" /> <div class="text">{{ item.comments || "讨论" }}</div> </a> <a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank"> <img class="icon" :src="valueUrl + '/img/bi-copper-icon.png'" /> <div class="text">{{ item.coins || "投币" }}</div> </a> <!-- 鼠标移入事件 --> <div class="bottom-item share flexacenter" @mouseenter="share" @click="isMobile ? copyLinkClick() : ''"> <img class="icon" :src="valueUrl + '/img/share-gray.png'" style="width: 19px; height: 19px;" /> <div class="text">{{ item.shares || '转发'}}</div> <div class="share-box flexcenter" ref="shareBoxRef"> <div class="share-item flexcenter" @click="copyLinkClick()"> <img class="share-icon" :src="valueUrl + '/img/copy-black-icon.png'" /> <div class="text">复制链接</div> </div> <!-- 鼠标移入 加载二维码 --> <div class="share-item wenxin flexcenter" @mouseenter="showQRcode"> <img class="share-icon" :src="valueUrl + '/img/weixin-icon.png'" /> <div class="text">微信转发</div> <div class="QRcode-box flexcenter" :class="{'right': isright}"> <img v-if="QRcode" class="QRcode" :src="QRcode" /> <div v-else class="QRcode flexcenter"> <img class="load" :src="valueUrl + '/img/load-icon.svg'" /> </div> <div class="text">微信扫码</div> </div> </div> </div> </div> </div> <like v-if="isLikeGif"></like></div>`,
});

View File

@@ -1,60 +1,62 @@
<a class="comment flexacenter" v-if="item?.commentreviews && !Array.isArray(item?.commentreviews)" :href="item.url" target="_blank">
<img class="icon" :src="item?.commentreviews?.avatar" />
<div class="text one-line-display">{{ item?.commentreviews?.content || "[图]" }}</div>
</a>
<template v-if="item.comment_list?.length != 0">
<a class="comment flexacenter" style="margin-bottom: 15px" v-for="(item, index) in item.comment_list" :key="index" :href="item.url" target="_blank">
<img class="icon" :src="item.avatar" />
<div class="text one-line-display">{{ item.content || "[图]" }}</div>
<div>
<a class="comment flexacenter" v-if="item?.commentreviews && !Array.isArray(item?.commentreviews)" :href="item.url" target="_blank">
<img class="icon" :src="item?.commentreviews?.avatar" />
<div class="text one-line-display">{{ item?.commentreviews?.content || "[图]" }}</div>
</a>
</template>
<div class="bottom flexacenter">
<div class="bottom-item like flexacenter" @click="likeClick()" v-if="item?.type != 'tenement'">
<img v-if="item.is_like" class="icon" :src="valueUrl + '/img/like-red-icon.png'" />
<img v-else class="icon" :src="valueUrl + '/img/like-icon.png'" />
<div class="text">{{ item.likes || "赞" }}</div>
</div>
<template v-if="item.comment_list?.length != 0">
<a class="comment flexacenter" style="margin-bottom: 15px" v-for="(item, index) in item.comment_list" :key="index" :href="item.url" target="_blank">
<img class="icon" :src="item.avatar" />
<div class="text one-line-display">{{ item.content || "[图]" }}</div>
</a>
</template>
<div class="bottom flexacenter">
<div class="bottom-item like flexacenter" @click="likeClick()" v-if="item?.type != 'tenement'">
<img v-if="item.is_like" class="icon" :src="valueUrl + '/img/like-red-icon.png'" />
<img v-else class="icon" :src="valueUrl + '/img/like-icon.png'" />
<div class="text">{{ item.likes || "赞" }}</div>
</div>
<div class="bottom-item flexacenter" @click="collectClick()">
<img v-if="item.is_collect" class="icon" :src="valueUrl + '/img/collect-golden.svg'" />
<img v-else class="icon" :src="valueUrl + '/img/collect-gray.png'" />
<div class="text">{{ item.collections || "收藏" }}</div>
</div>
<div class="bottom-item flexacenter" @click="collectClick()">
<img v-if="item.is_collect" class="icon" :src="valueUrl + '/img/collect-golden.svg'" />
<img v-else class="icon" :src="valueUrl + '/img/collect-gray.png'" />
<div class="text">{{ item.collections || "收藏" }}</div>
</div>
<a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank">
<img class="icon" :src="valueUrl + '/img/discuss-icon.png'" />
<div class="text">{{ item.comments || "讨论" }}</div>
</a>
<a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank">
<img class="icon" :src="valueUrl + '/img/discuss-icon.png'" />
<div class="text">{{ item.comments || "讨论" }}</div>
</a>
<a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank">
<img class="icon" :src="valueUrl + '/img/bi-copper-icon.png'" />
<div class="text">{{ item.coins || "投币" }}</div>
</a>
<a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank">
<img class="icon" :src="valueUrl + '/img/bi-copper-icon.png'" />
<div class="text">{{ item.coins || "投币" }}</div>
</a>
<!-- 鼠标移入事件 -->
<div class="bottom-item share flexacenter" @mouseenter="share" @click="isMobile ? copyLinkClick() : ''">
<img class="icon" :src="valueUrl + '/img/share-gray.png'" style="width: 19px; height: 19px;" />
<div class="text">{{ item.shares || '转发'}}</div>
<div class="share-box flexcenter" ref="shareBoxRef">
<div class="share-item flexcenter" @click="copyLinkClick()">
<img class="share-icon" :src="valueUrl + '/img/copy-black-icon.png'" />
<div class="text">复制链接</div>
</div>
<!-- 鼠标移入 加载二维码 -->
<div class="share-item wenxin flexcenter" @mouseenter="showQRcode">
<img class="share-icon" :src="valueUrl + '/img/weixin-icon.png'" />
<div class="text">微信转发</div>
<!-- 鼠标移入事件 -->
<div class="bottom-item share flexacenter" @mouseenter="share" @click="isMobile ? copyLinkClick() : ''">
<img class="icon" :src="valueUrl + '/img/share-gray.png'" style="width: 19px; height: 19px;" />
<div class="text">{{ item.shares || '转发'}}</div>
<div class="share-box flexcenter" ref="shareBoxRef">
<div class="share-item flexcenter" @click="copyLinkClick()">
<img class="share-icon" :src="valueUrl + '/img/copy-black-icon.png'" />
<div class="text">复制链接</div>
</div>
<!-- 鼠标移入 加载二维码 -->
<div class="share-item wenxin flexcenter" @mouseenter="showQRcode">
<img class="share-icon" :src="valueUrl + '/img/weixin-icon.png'" />
<div class="text">微信转发</div>
<div class="QRcode-box flexcenter" :class="{'right': isright}">
<img v-if="QRcode" class="QRcode" :src="QRcode" />
<div v-else class="QRcode flexcenter">
<img class="load" :src="valueUrl + '/img/load-icon.svg'" />
<div class="QRcode-box flexcenter" :class="{'right': isright}">
<img v-if="QRcode" class="QRcode" :src="QRcode" />
<div v-else class="QRcode flexcenter">
<img class="load" :src="valueUrl + '/img/load-icon.svg'" />
</div>
<div class="text">微信扫码</div>
</div>
<div class="text">微信扫码</div>
</div>
</div>
</div>
</div>
</div>
<like v-if="isLikeGif"></like>
<like v-if="isLikeGif"></like>
</div>

View File

@@ -167,5 +167,5 @@ export const itemHead = defineComponent({
report,
},
template: `<div class="item-head flexacenter" ref="itemHead"> <div class="user-box flexacenter" @click="goPersonalHomepage(item?.user?.uniqid)"> <img class="avatar" :src="item?.user?.avatar || item.avatar" /> <div class="name">{{ item?.user?.nickname || item.nickname || "匿名用户" }}</div> <img class="group" v-if="item.user?.groupimage" :src="item.user?.groupimage" /> </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="valueUrl + '/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="valueUrl + '/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="valueUrl + '/img/u1829.svg'"></image> </div> </div> </template> </div> <div class="view flexacenter"> <img class="icon" :src="valueUrl + '/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="valueUrl + '/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"> <a class="item icon" v-if="item.recommend == 1 && item.best != 1" target="_blank" href="/recommend"> <img style="height: 25px;" :src="valueUrl + '/img/recommend-icon.png'" /> </a> <a class="item icon" v-if="item.best == 1" target="_blank" href="/best"> <img style="height: 25px;" v-if="item.best == 1" :src="valueUrl + '/img/essence-icon.png'" /> </a> <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> <div class="item-head flexacenter" ref="itemHead"> <div class="user-box flexacenter" @click="goPersonalHomepage(item?.user?.uniqid)"> <img class="avatar" :src="item?.user?.avatar || item.avatar" /> <div class="name">{{ item?.user?.nickname || item.nickname || "匿名用户" }}</div> <img class="group" v-if="item.user?.groupimage" :src="item.user?.groupimage" /> </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="valueUrl + '/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="valueUrl + '/img/u1829.svg'" /> </div> <div class="isPublicity-item" :class="{'green': item.anonymous != 0}" @click.stop="cutAnonymousState(1)">匿名发表 <img v-if="item.anonymous != 0" class="isPublicityIcon" :src="valueUrl + '/img/u1829.svg'" /> </div> </div> </template> </div> <div class="view flexacenter"> <img class="icon" :src="valueUrl + '/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="valueUrl + '/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"> <a class="item icon" v-if="item.recommend == 1 && item.best != 1" target="_blank" href="/recommend"> <img style="height: 25px;" :src="valueUrl + '/img/recommend-icon.png'" /> </a> <a class="item icon" v-if="item.best == 1" target="_blank" href="/best"> <img style="height: 25px;" v-if="item.best == 1" :src="valueUrl + '/img/essence-icon.png'" /> </a> <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></div>`,
});

View File

@@ -1,75 +1,77 @@
<div class="item-head flexacenter" ref="itemHead">
<div class="user-box flexacenter" @click="goPersonalHomepage(item?.user?.uniqid)">
<img class="avatar" :src="item?.user?.avatar || item.avatar" />
<div class="name">{{ item?.user?.nickname || item.nickname || "匿名用户" }}</div>
<img class="group" v-if="item.user?.groupimage" :src="item.user?.groupimage" />
</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="valueUrl + '/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>
<div class="item-head flexacenter" ref="itemHead">
<div class="user-box flexacenter" @click="goPersonalHomepage(item?.user?.uniqid)">
<img class="avatar" :src="item?.user?.avatar || item.avatar" />
<div class="name">{{ item?.user?.nickname || item.nickname || "匿名用户" }}</div>
<img class="group" v-if="item.user?.groupimage" :src="item.user?.groupimage" />
</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="valueUrl + '/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="valueUrl + '/img/u1829.svg'"></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="valueUrl + '/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>
</div>
<div class="view flexacenter">
<img class="icon" :src="valueUrl + '/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="valueUrl + '/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 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="valueUrl + '/img/u1829.svg'" />
</div>
<div class="isPublicity-item" :class="{'green': item.anonymous != 0}" @click.stop="cutAnonymousState(1)">匿名发表
<img v-if="item.anonymous != 0" class="isPublicityIcon" :src="valueUrl + '/img/u1829.svg'" />
</div>
</div>
</template>
</div>
<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 class="view flexacenter">
<img class="icon" :src="valueUrl + '/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="valueUrl + '/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>
<div class="label flexflex" v-if="sectionn?.length || tags?.length || item.recommend == 1 || item.best == 1">
<a class="item icon" v-if="item.recommend == 1 && item.best != 1" target="_blank" href="/recommend">
<img style="height: 25px;" :src="valueUrl + '/img/recommend-icon.png'" />
</a>
<a class="item icon" v-if="item.best == 1" target="_blank" href="/best">
<img style="height: 25px;" v-if="item.best == 1" :src="valueUrl + '/img/essence-icon.png'" />
</a>
<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>
<div class="label flexflex" v-if="sectionn?.length || tags?.length || item.recommend == 1 || item.best == 1">
<a class="item icon" v-if="item.recommend == 1 && item.best != 1" target="_blank" href="/recommend">
<img style="height: 25px;" :src="valueUrl + '/img/recommend-icon.png'" />
</a>
<a class="item icon" v-if="item.best == 1" target="_blank" href="/best">
<img style="height: 25px;" v-if="item.best == 1" :src="valueUrl + '/img/essence-icon.png'" />
</a>
<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>
<report v-if="reportState" :itemdata="item"></report>
</div>

View File

@@ -32,5 +32,5 @@ export const itemMj = defineComponent({
itemHead,
},
template: `<div class="item-box item-mj"> <item-head :itemdata="item" :page="page"></item-head> <a class="school flexacenter" :href="item.url" target="_blank" v-if="item.data.schoolname"> <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>`,
template: `<div class="item-box item-mj"> <item-head :itemdata="item" :page="page"></item-head> <a class="school flexacenter" :href="item.url" target="_blank" v-if="item.data.schoolname"> <img class="icon" v-if="item.data.schoollogo" :src="item.data.schoollogo" /> <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,7 +1,7 @@
<div class="item-box item-mj">
<item-head :itemdata="item" :page="page"></item-head>
<a class="school flexacenter" :href="item.url" target="_blank" v-if="item.data.schoolname">
<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" />
<div class="text flex1 one-line-display">{{ item.data.schoolname }}</div>
</a>

View File

@@ -31,5 +31,5 @@ export const itemOffer = defineComponent({
itemHead,
},
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>`,
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" /> <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,7 +1,7 @@
<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>
<img class="icon" v-if="item.data.schoollogo" :src="item.data.schoollogo" />
<div class="text flex1 one-line-display">{{ item.data.schoolname }}</div>
</a>

View File

@@ -36,5 +36,5 @@ export const itemSummary = defineComponent({
itemHead,
},
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"> <template v-for="(it,i) in item.data.offerlist" :key="i"> <div class="item flexflex" v-if="i < 2"> <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> </template> <div v-if="item.data.offercount > 2" class="item more flexcenter"> <div class="item-content flexcenter"> <div class="">查看更多</div> <img class="icon" :src="valueUrl + '/img/arrows-circle-dark-blue.svg'" mode="heightFix"></image> </div> </div> </a> <item-bottom :itemdata="item" :page="page"></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-v2" :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"> <template v-for="(it,i) in item.data.offerlist" :key="i"> <div class="item flexflex" v-if="i < 2"> <div class="item-content flexflex"> <div class="school flexacenter"> <img class="icon" v-if="it.schoollogo" :src="it.schoollogo" /> <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> </template> <div v-if="item.data.offercount > 2" class="item more flexcenter"> <div class="item-content flexcenter"> <div class="">查看更多</div> <img class="icon" :src="valueUrl + '/img/arrows-circle-dark-blue.svg'" /> </div> </div> </a> <item-bottom :itemdata="item" :page="page"></item-bottom></div>`,
});

View File

@@ -1,7 +1,7 @@
<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="message one-line-display-v2" :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>
@@ -12,7 +12,7 @@
<div class="item flexflex" v-if="i < 2">
<div class="item-content flexflex">
<div class="school flexacenter">
<img class="icon" v-if="it.schoollogo" :src="it.schoollogo" mode="heightFix"></image>
<img class="icon" v-if="it.schoollogo" :src="it.schoollogo" />
<div class="name one-line-display flex1">{{ it.schoolname }}</div>
</div>
<div class="major one-line-display" v-if="it.professional">{{ it.professional }}</div>
@@ -30,7 +30,7 @@
<div v-if="item.data.offercount > 2" class="item more flexcenter">
<div class="item-content flexcenter">
<div class="">查看更多</div>
<img class="icon" :src="valueUrl + '/img/arrows-circle-dark-blue.svg'" mode="heightFix"></image>
<img class="icon" :src="valueUrl + '/img/arrows-circle-dark-blue.svg'" />
</div>
</div>
</a>

View File

@@ -7,7 +7,7 @@ export const loadBox = defineComponent({
name: "load-box",
props: {
loading: {
type: String,
type: Boolean,
default: "",
},
},