Compare commits

..

5 Commits

Author SHA1 Message Date
yuming 192867a8d5 版本号显示 v2.1.5 → v2.1.6
部署到群晖 / deploy (push) Successful in 41s
带农历日期显示的版本,重新上传体验版。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 14:21:11 +08:00
yuming e643512dfa 纪念日新增农历日期显示
部署到群晖 / deploy (push) Successful in 44s
- 人员详情页:日期下方显示完整农历「农历 YYYY年 X月X日」
- 日历页本月纪念日列表:日期下方显示农历月日「X月X日」
- 公历事件用 solarToLunar 算当年对应农历
- 农历事件按当年公历落点反算农历(与原始农历一致)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 14:19:14 +08:00
yuming f0835726de 版本号显示 v2.1.4 → v2.1.5
部署到群晖 / deploy (push) Successful in 36s
带日历跨年修复的版本,重新上传体验版。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 13:36:28 +08:00
yuming 030e587480 修复日历跨年不显示纪念日
部署到群晖 / deploy (push) Successful in 40s
原 buildEventIndex / loadMonthEvents 用 a.solarYear === year 判断,
只匹配纪念日原始录入年份的那一年。生日/纪念日是周年性事件,应
每年这天都出现。

- 去掉 solarYear === year 判断
- 新增 getAnniversaryDateInYear():公历直接用 solarMonth/solarDay
- 农历用 lunarToSolar 重算当年公历,因农历对应公历每年浮动
- 当年无闰月时 lunarToSolar 自动忽略 isLeap 回退普通月

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 13:35:20 +08:00
yuming fb7b12ff76 版本号显示 v2.1.3 → v2.1.4
部署到群晖 / deploy (push) Successful in 48s
为即将上传的微信小程序新版做准备,保持「数据」页底部
版本号与微信后台一致。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 13:04:31 +08:00
7 changed files with 74 additions and 21 deletions
+29 -13
View File
@@ -1,8 +1,20 @@
// calendar.js // calendar.js
const storage = require('../../utils/storage') const storage = require('../../utils/storage')
const dateUtils = require('../../utils/date') const dateUtils = require('../../utils/date')
const lunar = require('../../utils/lunar')
const { TYPE_NAMES, TYPE_ICONS, IMPORTANCE_COLORS } = require('../../utils/constants') const { TYPE_NAMES, TYPE_ICONS, IMPORTANCE_COLORS } = require('../../utils/constants')
// 算出某条纪念日在指定年份的公历 (month, day)
// 公历纪念日:每年同月同日,直接用录入时的 solarMonth/solarDay
// 农历纪念日:把农历月日转回当年公历,因为农历对应的公历日期每年都不同
function getAnniversaryDateInYear(a, year) {
if (a.isLunar && a.lunarMonth && a.lunarDay) {
const date = lunar.lunarToSolar(year, a.lunarMonth, a.lunarDay, !!a.isLeapMonth)
return { month: date.getMonth() + 1, day: date.getDate() }
}
return { month: a.solarMonth, day: a.solarDay }
}
Page({ Page({
data: { data: {
currentYear: new Date().getFullYear(), currentYear: new Date().getFullYear(),
@@ -27,8 +39,9 @@ Page({
buildEventIndex(anniversaries, year, month) { buildEventIndex(anniversaries, year, month) {
const index = {} const index = {}
for (const a of anniversaries) { for (const a of anniversaries) {
if (a.solarYear === year && a.solarMonth === month) { const { month: m, day: d } = getAnniversaryDateInYear(a, year)
const key = String(a.solarDay) if (m === month) {
const key = String(d)
if (!index[key]) index[key] = [] if (!index[key]) index[key] = []
index[key].push(a) index[key].push(a)
} }
@@ -100,24 +113,27 @@ Page({
const persons = storage.getPersons() const persons = storage.getPersons()
const anniversaries = storage.getAnniversaries() const anniversaries = storage.getAnniversaries()
// 筛选本月纪念日
const monthEvents = anniversaries const monthEvents = anniversaries
.filter(a => a.solarYear === currentYear && a.solarMonth === currentMonth)
.map(a => { .map(a => {
const person = persons.find(p => p.id === a.personId) const { month: m, day: d } = getAnniversaryDateInYear(a, currentYear)
const date = new Date(currentYear, currentMonth - 1, a.solarDay) return { ...a, _displayMonth: m, _displayDay: d }
const daysUntil = dateUtils.getDaysUntil(date) })
.filter(x => x._displayMonth === currentMonth)
.map(x => {
const person = persons.find(p => p.id === x.personId)
const date = new Date(currentYear, x._displayMonth - 1, x._displayDay)
const ld = lunar.solarToLunar(date)
return { return {
...a, ...x,
personName: person ? person.name : '未知', personName: person ? person.name : '未知',
typeIcon: this.getTypeIcon(a.type), typeIcon: this.getTypeIcon(x.type),
typeName: a.customTypeName || this.getTypeName(a.type), typeName: x.customTypeName || this.getTypeName(x.type),
dateText: dateUtils.formatDate(date, 'MM月DD日'), dateText: dateUtils.formatDate(date, 'MM月DD日'),
daysUntil lunarMD: ld.lunarText,
daysUntil: dateUtils.getDaysUntil(date)
} }
}) })
.sort((a, b) => a.solarDay - b.solarDay) .sort((a, b) => a._displayDay - b._displayDay)
this.setData({ monthEvents }) this.setData({ monthEvents })
}, },
+3
View File
@@ -40,7 +40,10 @@
<view class="event-header"> <view class="event-header">
<text class="event-icon">{{item.typeIcon}}</text> <text class="event-icon">{{item.typeIcon}}</text>
<text class="event-title">{{item.personName}} - {{item.typeName}}</text> <text class="event-title">{{item.personName}} - {{item.typeName}}</text>
<view class="event-date-group">
<text class="event-date">{{item.dateText}}</text> <text class="event-date">{{item.dateText}}</text>
<text class="event-lunar">{{item.lunarMD}}</text>
</view>
</view> </view>
<view class="event-info"> <view class="event-info">
<text wx:if="{{item.isLunar}}" class="lunar-badge">农历</text> <text wx:if="{{item.isLunar}}" class="lunar-badge">农历</text>
+14 -2
View File
@@ -249,11 +249,23 @@
white-space: nowrap; white-space: nowrap;
} }
.event-date-group {
display: flex;
flex-direction: column;
align-items: flex-end;
flex-shrink: 0;
margin-left: 12rpx;
gap: 2rpx;
}
.event-date { .event-date {
font-size: 24rpx; font-size: 24rpx;
color: #8A8278; color: #8A8278;
flex-shrink: 0; }
margin-left: 12rpx;
.event-lunar {
font-size: 20rpx;
color: #A9A096;
} }
.event-info { .event-info {
+3
View File
@@ -1,6 +1,7 @@
// person-detail.js // person-detail.js
const storage = require('../../utils/storage') const storage = require('../../utils/storage')
const dateUtils = require('../../utils/date') const dateUtils = require('../../utils/date')
const lunar = require('../../utils/lunar')
const fmt = require('../../utils/format') const fmt = require('../../utils/format')
Page({ Page({
@@ -52,11 +53,13 @@ Page({
const formatted = anniversaries.map(a => { const formatted = anniversaries.map(a => {
const date = new Date(a.solarYear, a.solarMonth - 1, a.solarDay) const date = new Date(a.solarYear, a.solarMonth - 1, a.solarDay)
const daysUntil = dateUtils.getDaysUntil(date) const daysUntil = dateUtils.getDaysUntil(date)
const ld = lunar.solarToLunar(date)
return { return {
...a, ...a,
date, date,
dateText: dateUtils.formatDate(date, 'YYYY年MM月DD日'), dateText: dateUtils.formatDate(date, 'YYYY年MM月DD日'),
lunarText: `农历 ${ld.year}${ld.lunarText}`,
daysUntil, daysUntil,
daysUntilAbs: Math.abs(daysUntil), daysUntilAbs: Math.abs(daysUntil),
typeIcon: fmt.getTypeIcon(a.type), typeIcon: fmt.getTypeIcon(a.type),
+5
View File
@@ -44,6 +44,11 @@
<text wx:if="{{item.isLunar}}" class="lunar-badge">农历</text> <text wx:if="{{item.isLunar}}" class="lunar-badge">农历</text>
</view> </view>
<view class="anniversary-lunar">
<text class="lunar-icon">🌙</text>
<text class="lunar-text">{{item.lunarText}}</text>
</view>
<view wx:if="{{item.daysUntil !== undefined}}" class="days-info"> <view wx:if="{{item.daysUntil !== undefined}}" class="days-info">
<text wx:if="{{item.daysUntil === 0}}" class="days-text urgent">今天</text> <text wx:if="{{item.daysUntil === 0}}" class="days-text urgent">今天</text>
<text wx:elif="{{item.daysUntil === 1}}" class="days-text warning">明天</text> <text wx:elif="{{item.daysUntil === 1}}" class="days-text warning">明天</text>
+15 -1
View File
@@ -193,11 +193,25 @@
} }
.anniversary-date { .anniversary-date {
margin-bottom: 12rpx; margin-bottom: 8rpx;
font-size: 24rpx; font-size: 24rpx;
color: #5A5247; color: #5A5247;
} }
.anniversary-lunar {
display: flex;
align-items: center;
gap: 8rpx;
margin-bottom: 12rpx;
font-size: 22rpx;
color: #8A8278;
}
.lunar-icon {
font-size: 20rpx;
opacity: 0.7;
}
.date-label { .date-label {
color: #8A8278; color: #8A8278;
} }
+1 -1
View File
@@ -19,7 +19,7 @@ Page({
personsCount: 0, personsCount: 0,
anniversariesCount: 0, anniversariesCount: 0,
lastBackupText: '从未备份', lastBackupText: '从未备份',
version: 'v2.1.3' version: 'v2.1.6'
}, },
onLoad() { onLoad() {