chore: 提交剩余开发改动

包含商务通消息映射、会话时间与未读状态、前端消息展示、数据库修复迁移、测试覆盖备份及 Captain 设计文档。
This commit is contained in:
Rogee
2026-08-06 10:10:25 +08:00
parent 8f2cc12628
commit b78f963472
38 changed files with 11691 additions and 1910 deletions
@@ -3,6 +3,17 @@ const MINUTE_IN_MILLI_SECONDS = 60000;
const HOUR_IN_MILLI_SECONDS = MINUTE_IN_MILLI_SECONDS * 60;
const DAY_IN_MILLI_SECONDS = HOUR_IN_MILLI_SECONDS * 24;
const chineseShortTimestamp = timestamp => {
if (timestamp === 'now') return '刚刚';
return timestamp
.replace(/^(\d+)mo$/, '$1个月')
.replace(/^(\d+)m$/, '$1分钟')
.replace(/^(\d+)h$/, '$1小时')
.replace(/^(\d+)d$/, '$1天')
.replace(/^(\d+)y$/, '$1年');
};
import { zhCN } from 'date-fns/locale';
import {
dynamicTime,
dateFormat,
@@ -37,34 +48,49 @@ export default {
};
},
computed: {
isChineseLocale() {
return this.$i18n.locale === 'zh_CN';
},
lastActivityTime() {
return shortTimestamp(this.lastActivityAtTimeAgo);
const timestamp = shortTimestamp(this.lastActivityAtTimeAgo);
return this.isChineseLocale ? chineseShortTimestamp(timestamp) : timestamp;
},
createdAtTime() {
return shortTimestamp(this.createdAtTimeAgo);
const timestamp = shortTimestamp(this.createdAtTimeAgo);
return this.isChineseLocale ? chineseShortTimestamp(timestamp) : timestamp;
},
createdAt() {
const createdTimeDiff = Date.now() - this.createdAtTimestamp * 1000;
const isBeforeAMonth = createdTimeDiff > DAY_IN_MILLI_SECONDS * 30;
const relativeTime = this.isChineseLocale
? dynamicTime(this.createdAtTimestamp, { locale: zhCN })
: this.createdAtTimeAgo;
const absoluteTime = this.isChineseLocale
? dateFormat(this.createdAtTimestamp, 'yyyy年M月d日', { locale: zhCN })
: dateFormat(this.createdAtTimestamp);
return !isBeforeAMonth
? `${this.$t('CHAT_LIST.CHAT_TIME_STAMP.CREATED.LATEST')} ${
this.createdAtTimeAgo
relativeTime
}`
: `${this.$t('CHAT_LIST.CHAT_TIME_STAMP.CREATED.OLDEST')} ${dateFormat(
this.createdAtTimestamp
)}`;
: `${this.$t('CHAT_LIST.CHAT_TIME_STAMP.CREATED.OLDEST')} ${absoluteTime}`;
},
lastActivity() {
const lastActivityTimeDiff =
Date.now() - this.lastActivityTimestamp * 1000;
const isNotActive = lastActivityTimeDiff > DAY_IN_MILLI_SECONDS * 30;
const relativeTime = this.isChineseLocale
? dynamicTime(this.lastActivityTimestamp, { locale: zhCN })
: this.lastActivityAtTimeAgo;
const absoluteTime = this.isChineseLocale
? dateFormat(this.lastActivityTimestamp, 'yyyy年M月d日', { locale: zhCN })
: dateFormat(this.lastActivityTimestamp);
return !isNotActive
? `${this.$t('CHAT_LIST.CHAT_TIME_STAMP.LAST_ACTIVITY.ACTIVE')} ${
this.lastActivityAtTimeAgo
relativeTime
}`
: `${this.$t(
'CHAT_LIST.CHAT_TIME_STAMP.LAST_ACTIVITY.NOT_ACTIVE'
)} ${dateFormat(this.lastActivityTimestamp)}`;
)} ${absoluteTime}`;
},
tooltipText() {
return `${this.createdAt}