修改完成待测试

This commit is contained in:
2026-09-13 17:45:47 +08:00
parent 9ad572907b
commit bbc024f7f2
80 changed files with 3844 additions and 1672 deletions
+94
View File
@@ -0,0 +1,94 @@
<template>
<view
class="login-advertisement"
:class="{ 'login-advertisement--linked': advertisement.targetUrl }"
:role="advertisement.targetUrl ? 'button' : 'img'"
:aria-label="advertisement.targetUrl
? `${advertisement.title}查看详情`
: advertisement.title"
@click="openAdvertisement"
>
<image :src="advertisement.image" mode="aspectFill" />
</view>
</template>
<script setup>
import { onBeforeUnmount, onMounted, ref } from "vue";
import {
createRequestController,
isRequestCancelled,
} from "@/services/api/request-controller.js";
import { siteContentApi } from "@/services/api/site-content-service.js";
import { openSiteContentTarget } from "@/utils/navigation/gateway.js";
const fallbackAdvertisement = Object.freeze({
title: "寻根问祖",
image: "/static/assets/modules/genealogy/opaque/home-ad-heritage-hall.png",
targetUrl: "",
});
const advertisement = ref(fallbackAdvertisement);
const promotionRequestController = createRequestController();
let isMounted = true;
const loadAdvertisement = async () => {
try {
const promotions = await siteContentApi.getPromotions({
placement: "home_banner",
requestController: promotionRequestController,
});
if (!isMounted) return;
const promotion = promotions.find((entry) => entry.coverFile?.accessUrl);
if (!promotion) return;
advertisement.value = {
title: promotion.title,
image: promotion.coverFile.accessUrl,
targetUrl: promotion.targetUrl,
};
} catch (error) {
if (!isMounted || isRequestCancelled(error)) return;
advertisement.value = fallbackAdvertisement;
}
};
const openAdvertisement = async () => {
if (!advertisement.value.targetUrl) return;
try {
await openSiteContentTarget(advertisement.value.targetUrl, () => {
uni.showToast({ title: "广告内容暂时打不开", icon: "none" });
});
} catch {
uni.showToast({ title: "广告内容暂时打不开", icon: "none" });
}
};
onMounted(loadAdvertisement);
onBeforeUnmount(() => {
isMounted = false;
promotionRequestController.abort();
});
</script>
<style scoped lang="scss">
.login-advertisement {
width: 100%;
height: 128rpx;
flex: 0 0 auto;
overflow: hidden;
box-sizing: border-box;
margin-top: 22rpx;
border: 1rpx solid rgba(142, 96, 44, 0.38);
border-radius: 12rpx;
background: #f1ece2;
}
.login-advertisement--linked:active {
opacity: 0.78;
}
.login-advertisement image {
display: block;
width: 100%;
height: 100%;
}
</style>