// my-component.js // 引入全局 Vue 对象(因在 HTML 中通过 script 引入,Vue 已挂载到 window) const { defineComponent, ref, provide, onMounted, inject, defineAsyncComponent } = Vue; // const { report } = await import(withVer("../report/report.js")); const report = defineAsyncComponent(() => import(withVer("../report/report.js")).then((m) => m.report)); // 定义组件(直接使用模板) export const itemHead = defineComponent({ name: "item-head", props: { itemdata: { type: Object, default: () => {}, }, page: { type: String, default: "", }, }, setup(props) { let sectionn = ref([]); let tags = ref([]); let item = ref({ ...props.itemdata }); if (!item.value.hidden) item.value.hidden = 0; // item.value['best'] = 0 // item.value['recommend'] = 1 let timestamp = ref(strtimeago(item.value.release_at, 4)); if (item.value.type == "tenement") timestamp = timeago(item.value.updatetime, 2); sectionn.value = item.value.sectionn || []; const sectionNameSet = new Set(sectionn.value.map((item) => item.name)); tags.value = item.value?.tags || []; tags.value = tags.value?.filter((tagName) => !sectionNameSet.has(tagName)) || []; // const sectionSet = new Set(sectionn.value); // tags.value = item.value.tags?.filter((tag) => !sectionSet.has(tag)); let show = ref(false); const cutShow = () => { show.value = !show.value; // 修改为切换显示状态 }; let reportState = ref(false); provide("reportState", reportState); let ismanager = ref(false); // 添加管理员状态变量 let permissions = ref([]); let valueUrl = ref(""); onMounted(() => { setTimeout(() => { permissions.value = window["permissions"] || []; ismanager.value = permissions.value.indexOf("topic:manager") >= 0; }, 1000); const valueA = document.querySelector(".valueA"); valueUrl.value = valueA.innerText; }); // 举报 const report = () => { cutShow(); reportState.value = true; }; // 隐藏 const hide = () => { const target = item.value; managerHide(target.token, target.hidden, target.type).then((value) => { target.hidden = value; item.value = target; cutShow(); }); }; // 推荐 const recommend = () => { const target = item.value; managerRecommend(target.token, target.recommend).then((value) => { target.recommend = value; item.value = target; cutShow(); }); }; // 精华 const essence = () => { const target = item.value; managerEssence(target.token, target.best).then((value) => { target.best = value; item.value = target; cutShow(); }); }; // let handleDelete = inject("handleDelete"); let itemHead = ref(null); // 删除 const deleteItem = () => { const target = item.value; managerDelete(target.token) .then(() => { const targetNode = itemHead.value; if (!targetNode) return; const parentItemBox = targetNode.parentElement; if (parentItemBox?.classList.contains("item-box")) parentItemBox.style.display = "none"; }) .finally(() => { cutShow(); }); }; // 编辑 const edit = () => { const target = item.value; redirectToExternalWebsite(`/publish?uniqid=${target.uniqid}`); }; const goPersonalHomepage = (token) => { if (!token) return; redirectToExternalWebsite(`/u/${token}`); }; 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) => { const target = item.value; ajax("/v2/api/forum/setTopicAnonymousStatus", { token: target.token, anonymous: state, }) .then((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 { valueUrl, itemHead, cutAnonymousState, cutAnonymous, anonymousState, openedit, edit, deleteItem, goPersonalHomepage, reportState, cutShow, show, item, timestamp, sectionn, tags, ismanager, report, hide, recommend, essence }; }, components: { report, }, template: `