更新最新代码

This commit is contained in:
CodeBuddy
2026-10-26 17:32:47 +08:00
commit 0f5dc01674
315 changed files with 42640 additions and 0 deletions
+167
View File
@@ -0,0 +1,167 @@
const { itemsOf, startList, applyList, failList, finishList, withListPagination } = require('../../utils/list-pagination');
const { withDataCache } = require('../../utils/page-cache');
const { getLayout } = require('../../utils/layout');
// Diary journal with server pagination.
const { api, getImageUrl } = require('../../utils/request');
const { diaryEntry } = require('../../utils/journal');
const { saveScrollPosition, getScrollPosition } = require('../../utils/scroll-pos');
Page(withDataCache(withListPagination({
onResize: function() { this.setData(getLayout()); },
data: {
loading: true, loadError: false,
list: [],
page: 1,
pageSize: 20,
total: 0,
loadingMore: false,
hasMore: true,
scrollTop: 0,
tabType: 'all' // 'all' 全部 | 'favorite' 收藏
},
onLoad: function(options) {
this.setData(getLayout());
this.setData({ scrollTop: getScrollPosition('diary') });
},
onShow: function() {
this.loadData();
},
// 收藏 tab 切换已移除
onScroll: function(e) {
this._scrollTop = e.detail.scrollTop;
saveScrollPosition('diary', e.detail.scrollTop);
},
onPullDownRefresh: async function() {
this.setData({ page: 1, list: [], hasMore: true });
await this.loadData();
wx.stopPullDownRefresh();
},
onScrollToLower: function() {
if (this.data.loadingMore || !this.data.hasMore) return;
this.loadMore();
},
onShareAppMessage: function() {
return { title: '让所有的爱有迹可循', path: '/pages/diary/diary', imageUrl: '/images/share.png' };
},
onShareTimeline: function() {
return { title: '让所有的爱有迹可循', imageUrl: '/images/share.png' };
},
loadData: async function(page) {
const ticket=startList(this,page);if(!ticket)return;
try {
const data=await api.diaryList({page:ticket.page,page_size:20});
applyList(this,ticket,data,this._formatItems(itemsOf(data)),'list');
this._loadPartnerInfo();
} catch(e) { failList(this,ticket); }
finally { finishList(this,ticket); }
},
_formatItems: function(items) {
var myUid = wx.getStorageSync('userId');
var partnerNames = {};
var partnerAvatars = {};
return items.map(function(item) {
item.creator_name = partnerNames[item.created_by] || '我';
item.creator_avatar = partnerAvatars[item.created_by] || '';
item.created_time = item.created_at ? item.created_at.substring(0, 16).replace('T', ' ') : '';
var imgs = item.images || [];
if (typeof imgs === 'string') {
try { imgs = JSON.parse(imgs); } catch(e) { imgs = []; }
}
if (!Array.isArray(imgs)) imgs = [];
item.imageUrls = imgs.map(function(p) { return getImageUrl(p); });
// 生成摘要文本(截断内容,用于无图卡片展示)
var summaryText = item.content || item.title || '';
summaryText = summaryText.replace(/\s+/g, ' ');
if (summaryText.length > 80) summaryText = summaryText.substring(0, 80) + '...';
item.summary = summaryText;
// 地理位置:优先显示地址名称,其次显示经纬度
item.location_text = item.location || ((item.lat && item.lng) ? (item.lat + ', ' + item.lng) : '');
return Object.assign(item, diaryEntry(item));
});
},
_loadPartnerInfo: async function() {
try {
var info = await api.coupleInfo();
var myUid = wx.getStorageSync('userId');
var p1 = info.partner1 || {}, p2 = info.partner2 || {};
var names = {}, avatars = {};
names[p1.id] = p1.nickname || p1.username || 'TA';
names[p2.id] = p2.nickname || p2.username || 'TA';
avatars[p1.id] = getImageUrl(p1.avatar);
avatars[p2.id] = getImageUrl(p2.avatar);
var oldList = this.data.list;
var changed = false;
var updates = {};
for (var i = 0; i < oldList.length; i++) {
var item = oldList[i];
var newName = names[item.created_by] || '我';
var newAvatar = avatars[item.created_by] || '';
if (item.creator_name !== newName || item.creator_avatar !== newAvatar) {
updates['list[' + i + '].creator_name'] = newName;
updates['list[' + i + '].author'] = newName;
updates['list[' + i + '].creator_avatar'] = newAvatar;
changed = true;
}
}
if (changed) {
this.setData(updates);
}
} catch (e) {}
},
_refreshPartnerInfo: function() {
var self = this;
api.coupleInfo().then(function(info) {
var myUid = wx.getStorageSync('userId');
var p1 = info.partner1 || {}, p2 = info.partner2 || {};
var names = {}, avatars = {};
names[p1.id] = p1.nickname || p1.username || 'TA';
names[p2.id] = p2.nickname || p2.username || 'TA';
avatars[p1.id] = getImageUrl(p1.avatar);
avatars[p2.id] = getImageUrl(p2.avatar);
var oldList = self.data.list;
var changed = false;
var updates = {};
for (var i = 0; i < oldList.length; i++) {
var item = oldList[i];
var newName = names[item.created_by] || '我';
var newAvatar = avatars[item.created_by] || '';
if (item.creator_name !== newName || item.creator_avatar !== newAvatar) {
updates['list[' + i + '].creator_name'] = newName;
updates['list[' + i + '].author'] = newName;
updates['list[' + i + '].creator_avatar'] = newAvatar;
changed = true;
}
}
if (changed) {
self.setData(updates);
}
}).catch(function() {});
},
// 点击进入日记详情
goToDetail: function(e) {
var id = e.currentTarget.dataset.id;
if (!id) return;
saveScrollPosition('diary', this._scrollTop == null ? this.data.scrollTop : this._scrollTop);
wx.navigateTo({ url: '/pages/diary_detail/diary_detail?id=' + id });
},
_savePosBeforeLeave: function() {
saveScrollPosition('diary', this._scrollTop == null ? this.data.scrollTop : this._scrollTop);
},
openJournalEntry: function(e) { this.goToDetail(e); },
goToPublish: function() { this._savePosBeforeLeave(); wx.navigateTo({ url: '/pages/publish/publish?type=diary' }); },
goHome: function() { this._savePosBeforeLeave(); wx.switchTab({ url: '/pages/index/index' }); },
goBack: function() { wx.navigateBack(); },
goProfile: function() { this._savePosBeforeLeave(); wx.switchTab({ url: '/pages/profile/profile' }); }
}, 'loadData'), {"loadData": ["diaryList", "coupleInfo"]}));
+8
View File
@@ -0,0 +1,8 @@
{
"navigationStyle": "custom",
"enablePullDownRefresh": true,
"usingComponents": {
"app-nav": "/components/app-nav/app-nav",
"page-state": "/components/page-state/page-state"
}
}
+9
View File
@@ -0,0 +1,9 @@
<import src="../../templates/journal.wxml" />
<launch-transition />
<view class="app-shell app-shell--secondary" style="{{layoutStyle}}"><app-nav title="日记" back="{{true}}" />
<scroll-view class="page-bg" scroll-y show-scrollbar="{{false}}" bindscrolltolower="onScrollToLower" lower-threshold="100" bindscroll="onScroll" scroll-top="{{scrollTop}}">
<view class="j-body"><view class="j-row"><view><text class="j-eyebrow">LIFE IN WORDS</text><text class="j-page-title">生活里的每一页</text></view><button class="j-button j-button-small" bindtap="goToPublish">+ 写日记</button></view>
<page-state wx:if="{{loading}}" kind="loading" title="正在翻开日记" /><page-state wx:elif="{{loadError}}" kind="error" title="加载失败" action="重试" bind:action="loadData" />
<block wx:else><block wx:for="{{list}}" wx:key="id"><template is="journal-entry" data="{{entry:item}}" /></block><page-state wx:if="{{!list.length}}" title="故事,从今天开始" description="写下第一篇,记录一个平常又特别的瞬间" action="写日记" bind:action="goToPublish" /></block>
<view class="j-caption j-center" wx:if="{{loadingMore}}">正在加载更多…</view></view><view class="j-pagination" wx:if="{{!loading && !loadError && total > 0}}"><text wx:if="{{loadingMore}}">正在加载…</text><text wx:elif="{{moreError}}" bindtap="loadMore">加载失败,点击重试</text><text wx:elif="{{hasMore}}" bindtap="loadMore">加载更多</text><text wx:else>已加载全部日记</text></view>
</scroll-view></view>
+7
View File
@@ -0,0 +1,7 @@
@import '../../styles/common.wxss';
@import '../../styles/design.wxss';
@import '../../styles/journal.wxss';
@import '../../styles/button-theme.wxss';
@import '../../styles/typography.wxss';