Add AMap location and weather header with warm mini program theme
ci-cd / verify (push) Successful in 1m54s
ci-cd / deploy (push) Skipped

This commit is contained in:
2026-10-04 11:03:34 +08:00
parent c2b51f96e0
commit 7fc50f9212
37 changed files with 568 additions and 122 deletions
+49
View File
@@ -1,7 +1,13 @@
const { secure, toast } = require("../../utils/api");
const { localDate } = require("../../utils/date");
function dateLabel() {
const now = new Date();
return `${now.getMonth() + 1}月${now.getDate()}日 周${"日一二三四五六"[now.getDay()]}`;
}
Page({
data: {
locationName: "当前位置",
headerSubtitle: dateLabel() + " · 轻触获取天气",
pets: [],
selected: [],
tasks: [],
@@ -11,6 +17,49 @@ Page({
},
onShow() {
this.load();
this.updateEnvironmentLabel();
if (!this.environmentAt || Date.now() - this.environmentAt > 15 * 60 * 1000) {
this.refreshEnvironment();
}
},
updateEnvironmentLabel() {
this.setData({ headerSubtitle: dateLabel() + " · " + (this.weatherLabel || "轻触获取天气") });
},
async refreshEnvironment(event) {
if (this.environmentBusy) return;
this.environmentBusy = true;
const tapped = !!event;
let positioned = false;
try {
const settings = await new Promise((resolve, reject) => wx.getSetting({ success: resolve, fail: reject }));
if (settings.authSetting["scope.userLocation"] === false) {
if (!tapped) throw new Error("location-denied");
const enabled = await new Promise((resolve, reject) => wx.openSetting({ success: resolve, fail: reject }));
if (!enabled.authSetting["scope.userLocation"]) throw new Error("location-denied");
}
this.weatherLabel = "正在获取天气";
this.updateEnvironmentLabel();
const point = await new Promise((resolve, reject) => wx.getLocation({
type: "gcj02",
success: resolve,
fail: reject,
}));
positioned = true;
const result = await secure("/environment", "GET", { latitude: point.latitude, longitude: point.longitude });
this.setData({ locationName: result.location_name });
this.weatherLabel = result.weather
? `${result.weather.description} ${result.weather.temperature}°C`
: "天气暂不可用";
this.environmentAt = result.weather ? Date.now() : 0;
} catch (error) {
const denied = /denied|deny|auth/.test(error.errMsg || error.message || "");
this.setData({ locationName: positioned ? "位置暂不可用" : denied ? "开启定位" : "定位暂不可用" });
this.weatherLabel = denied ? "轻触开启定位" : "轻触重试";
if (tapped && !denied) wx.showToast({ title: positioned ? "位置和天气获取失败,请重试" : "定位失败,请重试", icon: "none" });
} finally {
this.environmentBusy = false;
this.updateEnvironmentLabel();
}
},
async load() {
try {