fix: daily page
This commit is contained in:
15
api/daily.js
Normal file
15
api/daily.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { request } from "@/utils/request.js";
|
||||||
|
|
||||||
|
export const getDailyInfo = async () => {
|
||||||
|
return request({
|
||||||
|
url: "/api/blessing/daily-greeting/home",
|
||||||
|
method: "GET",
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getDailyRandomGreeting = async () => {
|
||||||
|
return request({
|
||||||
|
url: "/api/blessing/daily-greeting/random",
|
||||||
|
method: "GET",
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -18,7 +18,18 @@
|
|||||||
|
|
||||||
<!-- Main Card -->
|
<!-- Main Card -->
|
||||||
<view class="main-card-container">
|
<view class="main-card-container">
|
||||||
<view class="quote-card">
|
<view
|
||||||
|
class="quote-card"
|
||||||
|
:style="
|
||||||
|
currentQuote.backgroundUrl
|
||||||
|
? {
|
||||||
|
backgroundImage: `url(${currentQuote.backgroundUrl})`,
|
||||||
|
backgroundSize: 'cover',
|
||||||
|
backgroundPosition: 'center',
|
||||||
|
}
|
||||||
|
: {}
|
||||||
|
"
|
||||||
|
>
|
||||||
<view class="quote-icon">❝</view>
|
<view class="quote-icon">❝</view>
|
||||||
<view class="quote-content">
|
<view class="quote-content">
|
||||||
<text class="quote-text">{{ currentQuote.text }}</text>
|
<text class="quote-text">{{ currentQuote.text }}</text>
|
||||||
@@ -53,7 +64,7 @@
|
|||||||
<view class="category-section">
|
<view class="category-section">
|
||||||
<view class="category-grid">
|
<view class="category-grid">
|
||||||
<view
|
<view
|
||||||
v-for="(cat, index) in categories"
|
v-for="(cat, index) in scenes"
|
||||||
:key="index"
|
:key="index"
|
||||||
class="category-item"
|
class="category-item"
|
||||||
@tap="selectCategory(cat.id)"
|
@tap="selectCategory(cat.id)"
|
||||||
@@ -63,7 +74,7 @@
|
|||||||
:class="{ active: currentCategory === cat.id }"
|
:class="{ active: currentCategory === cat.id }"
|
||||||
:style="{ background: cat.bg }"
|
:style="{ background: cat.bg }"
|
||||||
>
|
>
|
||||||
<text class="cat-emoji">{{ cat.emoji }}</text>
|
<text class="cat-emoji">{{ cat.icon }}</text>
|
||||||
</view>
|
</view>
|
||||||
<text
|
<text
|
||||||
class="cat-name"
|
class="cat-name"
|
||||||
@@ -146,10 +157,12 @@ import {
|
|||||||
} from "@dcloudio/uni-app";
|
} from "@dcloudio/uni-app";
|
||||||
import { useUserStore } from "@/stores/user";
|
import { useUserStore } from "@/stores/user";
|
||||||
|
|
||||||
|
import { getDailyInfo } from "@/api/daily";
|
||||||
|
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
|
||||||
const navBarHeight = getBavBarHeight();
|
const navBarHeight = getBavBarHeight();
|
||||||
const streakDays = ref(5);
|
const streakDays = ref(0);
|
||||||
|
|
||||||
const dateStr = computed(() => {
|
const dateStr = computed(() => {
|
||||||
const date = new Date();
|
const date = new Date();
|
||||||
@@ -165,70 +178,70 @@ const greetingTitle = computed(() => {
|
|||||||
return "晚安,好梦相伴";
|
return "晚安,好梦相伴";
|
||||||
});
|
});
|
||||||
|
|
||||||
const categories = [
|
const scenes = ref([]);
|
||||||
{ id: "vitality", name: "元气", emoji: "😊", bg: "#fff8e1" },
|
const currentCategory = ref("");
|
||||||
{ id: "luck", name: "好运", emoji: "🍀", bg: "#e8f5e9" },
|
|
||||||
{ id: "gentle", name: "温柔", emoji: "❤️", bg: "#ffebee" },
|
|
||||||
{ id: "work", name: "工作", emoji: "💼", bg: "#e3f2fd" },
|
|
||||||
{ id: "funny", name: "搞笑", emoji: "😂", bg: "#fff3e0" },
|
|
||||||
];
|
|
||||||
|
|
||||||
const currentCategory = ref("vitality");
|
const currentQuote = ref({
|
||||||
|
text: "",
|
||||||
const quotes = {
|
highlight: "",
|
||||||
vitality: [
|
author: "",
|
||||||
{
|
backgroundUrl: "",
|
||||||
text: "愿你眼中有星辰\n心中有山海\n每一步都走在",
|
id: "",
|
||||||
highlight: "开满鲜花的路上",
|
});
|
||||||
author: "陈小明",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: "生活原本沉闷\n但跑起来就有风",
|
|
||||||
highlight: "做自己的小太阳",
|
|
||||||
author: "李华",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
luck: [
|
|
||||||
{
|
|
||||||
text: "好运正在派送中\n请保持心情舒畅",
|
|
||||||
highlight: "万事顺遂",
|
|
||||||
author: "锦鲤",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
gentle: [
|
|
||||||
{
|
|
||||||
text: "温柔是宝藏\n你也是",
|
|
||||||
highlight: "岁月静好",
|
|
||||||
author: "微风",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
work: [
|
|
||||||
{
|
|
||||||
text: "打工人的意志\n是钢铁铸成的",
|
|
||||||
highlight: "搞钱要紧",
|
|
||||||
author: "打工人",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
funny: [
|
|
||||||
{
|
|
||||||
text: "间歇性踌躇满志\n持续性混吃等死",
|
|
||||||
highlight: "这就是人生",
|
|
||||||
author: "咸鱼",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
const currentQuote = ref(quotes.vitality[0]);
|
|
||||||
const authorName = ref("");
|
const authorName = ref("");
|
||||||
|
|
||||||
// Remove automatic sync with quote author to allow custom input to persist
|
const loadDailyInfo = async () => {
|
||||||
// watch(
|
try {
|
||||||
// currentQuote,
|
const res = await getDailyInfo();
|
||||||
// (newVal) => {
|
if (res) {
|
||||||
// authorName.value = newVal.author;
|
streakDays.value = res.streakDays || 0;
|
||||||
// },
|
if (res.lastSignature && !authorName.value) {
|
||||||
// { deep: true }
|
authorName.value = res.lastSignature;
|
||||||
// );
|
}
|
||||||
|
|
||||||
|
if (res.scenes && res.scenes.length > 0) {
|
||||||
|
scenes.value = res.scenes;
|
||||||
|
if (!currentCategory.value) {
|
||||||
|
currentCategory.value = res.scenes[0].id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res.mainHero) {
|
||||||
|
const { greetingContent, backgroundUrl, greetingId, greetingScene } =
|
||||||
|
res.mainHero;
|
||||||
|
let text = "";
|
||||||
|
let highlight = "";
|
||||||
|
if (greetingContent) {
|
||||||
|
const parts = greetingContent.split(" ");
|
||||||
|
if (parts.length > 1) {
|
||||||
|
highlight = parts.pop();
|
||||||
|
text = parts.join("\n");
|
||||||
|
} else {
|
||||||
|
text = greetingContent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
currentQuote.value = {
|
||||||
|
text,
|
||||||
|
highlight,
|
||||||
|
author: authorName.value, // Will be reactive in template via authorName ref
|
||||||
|
backgroundUrl: backgroundUrl || "",
|
||||||
|
id: greetingId,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (greetingScene) {
|
||||||
|
currentCategory.value = greetingScene;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Failed to load daily info:", e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
loadDailyInfo();
|
||||||
|
});
|
||||||
|
|
||||||
const hotList = ref([
|
const hotList = ref([
|
||||||
{ text: "新的一年,愿灵马带走烦恼...", count: "2.4" },
|
{ text: "新的一年,愿灵马带走烦恼...", count: "2.4" },
|
||||||
@@ -237,17 +250,24 @@ const hotList = ref([
|
|||||||
|
|
||||||
const selectCategory = (id) => {
|
const selectCategory = (id) => {
|
||||||
currentCategory.value = id;
|
currentCategory.value = id;
|
||||||
|
// TODO: Call API to get quote for this category if API supports it
|
||||||
|
// For now, we just reload daily info which might not be category specific
|
||||||
|
// If the API supports category param, we should use it.
|
||||||
|
// Assuming getDailyInfo might accept params but user didn't specify.
|
||||||
|
// Or maybe we should just rely on refreshQuote?
|
||||||
refreshQuote();
|
refreshQuote();
|
||||||
};
|
};
|
||||||
|
|
||||||
const refreshQuote = () => {
|
const refreshQuote = () => {
|
||||||
const list = quotes[currentCategory.value] || quotes.vitality;
|
// Since we don't have a specific refresh API in the prompt, re-call loadDailyInfo
|
||||||
const randomIndex = Math.floor(Math.random() * list.length);
|
// This might just reload the same "daily" greeting or a new one.
|
||||||
currentQuote.value = list[randomIndex];
|
// Ideally there should be a refresh API.
|
||||||
|
loadDailyInfo();
|
||||||
};
|
};
|
||||||
|
|
||||||
const useHotItem = (item) => {
|
const useHotItem = (item) => {
|
||||||
currentQuote.value = {
|
currentQuote.value = {
|
||||||
|
...currentQuote.value,
|
||||||
text: item.text,
|
text: item.text,
|
||||||
highlight: "",
|
highlight: "",
|
||||||
author: "热榜推荐",
|
author: "热榜推荐",
|
||||||
|
|||||||
Reference in New Issue
Block a user