feat(app): 检查更新与桌面端一致,新版本不高于服务器版本才提示

- 提示逻辑移到 App.vue checkAppUpdate,$A.eeuiAppCheckUpdate 只做桥接
- 手动检查遇到服务器版本较低时提示等待服务器升级
- 更新语言包、事件对照表、ai-kb 与 Expo 壳子模块
This commit is contained in:
kuaifan 2026-10-19 13:41:53 +00:00
parent bf1c9b7751
commit 96bc70415f
19 changed files with 102 additions and 45 deletions

View File

@ -7,14 +7,14 @@
> - 事件总线: `resources/assets/js/store/events.js`(mitt 实例)
> - 仅匹配裸 `emitter.emit/on/off(` 调用;`xxx.emitter.emit(`(如 Quill 内部 emitter)不属于本总线,已排除
共 **30** 个静态可解析事件,**125** 处 `emitter.emit/on/off` 调用。
共 **31** 个静态可解析事件,**128** 处 `emitter.emit/on/off` 调用。
## 事件清单
### `addMeeting`
- **emit(10)**
- `resources/assets/js/App.vue:422`
- `resources/assets/js/App.vue:469`
- `resources/assets/js/pages/manage.vue:1278`
- `resources/assets/js/pages/manage.vue:1285`
- `resources/assets/js/pages/manage/application.vue:1198`
@ -23,7 +23,7 @@
- `resources/assets/js/pages/manage/components/DialogView/index.vue:621`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:2040`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:2048`
- `resources/assets/js/pages/manage/messenger.vue:1227`
- `resources/assets/js/pages/manage/messenger.vue:1408`
- **on(1)**
- `resources/assets/js/pages/manage/components/MeetingManager/index.vue:187`
- **off(1)**
@ -66,21 +66,30 @@
- **off(1)**
- `resources/assets/js/components/AIAssistant/float-button.vue:165`
### `checkAppUpdate`
- **emit(1)**
- `resources/assets/js/pages/manage/setting/index.vue:249`
- **on(1)**
- `resources/assets/js/App.vue:148`
- **off(1)**
- `resources/assets/js/App.vue:153`
### `clickAgainDialog`
- **emit(1)**
- `resources/assets/js/components/Mobile/Tabbar.vue:188`
- **on(1)**
- `resources/assets/js/pages/manage/messenger.vue:344`
- `resources/assets/js/pages/manage/messenger.vue:370`
- **off(1)**
- `resources/assets/js/pages/manage/messenger.vue:348`
- `resources/assets/js/pages/manage/messenger.vue:374`
### `createGroup`
- **emit(3)**
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:2894`
- `resources/assets/js/pages/manage/components/UserDetail.vue:294`
- `resources/assets/js/pages/manage/messenger.vue:1232`
- `resources/assets/js/pages/manage/messenger.vue:1413`
- **on(1)**
- `resources/assets/js/pages/manage.vue:601`
- **off(1)**
@ -121,7 +130,7 @@
### `observeMicroApp:open`
- **emit(1)**
- `resources/assets/js/store/actions.js:5479`
- `resources/assets/js/store/actions.js:5482`
- **on(1)**
- `resources/assets/js/components/MicroApps/index.vue:202`
- **off(1)**
@ -199,7 +208,7 @@
### `openProjectInvite`
- **emit(1)**
- `resources/assets/js/App.vue:434`
- `resources/assets/js/App.vue:481`
- **on(1)**
- `resources/assets/js/pages/manage/components/ProjectInvite.vue:83`
- **off(1)**
@ -238,7 +247,7 @@
- `resources/assets/js/components/UserAvatar/index.vue:184`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:2963`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:4546`
- `resources/assets/js/pages/manage/messenger.vue:1237`
- `resources/assets/js/pages/manage/messenger.vue:1418`
- **on(1)**
- `resources/assets/js/pages/manage/components/UserDetail.vue:166`
- **off(1)**
@ -276,7 +285,7 @@
- **emit(2)**
- `resources/assets/js/pages/manage.vue:1153`
- `resources/assets/js/pages/manage/setting/index.vue:198`
- `resources/assets/js/pages/manage/setting/index.vue:200`
- **on(1)**
- `resources/assets/js/components/RightBottom.vue:65`
- **off(1)**
@ -323,7 +332,7 @@
## 统计
- 事件总数(静态可解析): **30**
- 事件总数(静态可解析): **31**
- 只 emit 无 on(疑似死事件): **0**
- 只 on 无 emit(无人发射): **1** — `aiAssistantFloatButtonVisibilityChanged`
- 动态事件名调用: **1**

View File

@ -2852,3 +2852,4 @@ App Secret
DooTask 新版本 (*) 已发布,建议更新以获得更好的使用体验。
已是最新版本
检查更新失败,请稍后再试
当前服务器版本较低,请等待服务器升级后再更新

View File

@ -41086,5 +41086,17 @@
"fr": "Fournisseur push invalide",
"id": "Vendor push tidak valid",
"ru": "Неверный поставщик push-уведомлений"
},
{
"key": "当前服务器版本较低,请等待服务器升级后再更新",
"zh": "",
"zh-CHT": "目前伺服器版本較低,請等待伺服器升級後再更新",
"en": "The server version is outdated. Please update after the server has been upgraded.",
"ko": "현재 서버 버전이 낮습니다. 서버가 업그레이드된 후 업데이트하세요.",
"ja": "現在のサーバーのバージョンが古いため、サーバーのアップグレード後に更新してください。",
"de": "Die Serverversion ist veraltet. Bitte aktualisiere erst, nachdem der Server aktualisiert wurde.",
"fr": "La version du serveur est obsolète. Veuillez mettre à jour après la mise à niveau du serveur.",
"id": "Versi server saat ini lebih lama. Silakan perbarui setelah server ditingkatkan.",
"ru": "Версия сервера устарела. Обновите приложение после обновления сервера."
}
]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -64,10 +64,11 @@ last_verified: v1.9.66
新版 App 每天回到前台时自动检查一次,有新版本时弹出「发现新版本」:
- 「立即更新」:iOS 跳转 App Store 的 DooTask 页面;Android 用系统浏览器打开官方 apk 下载地址,下载完点开安装
- 「以后再说」:关闭提示,第二天回到前台会再次提醒
- 版本来源:iOS 查 App Store 上架版本,Android 查官网(download.dootask.com)最新安装包;只在官方版本高于本机版本时提示,与连接的服务器无关
- 网络失败时不提示
- 版本来源:iOS 查 App Store 上架版本,Android 查官网(download.dootask.com)最新安装包
- 只在官方版本高于本机版本、且不高于当前连接的服务器版本时提示(与桌面端一致:服务器未升级时不提示,避免新版 App 调用旧服务器接口出错)
- 网络失败或获取不到服务器版本时不提示
手动检查:设置 →「版本」一行右侧点「检查更新」,已是最新会提示「已是最新版本」,有新版本则弹出同样的提示。
手动检查:设置 →「版本」一行右侧点「检查更新」,已是最新会提示「已是最新版本」;官方有新版本但服务器版本较低时提示「当前服务器版本较低,请等待服务器升级后再更新」(自部署需管理员先升级服务器);可以更新时弹出同样的提示。
## 看当前版本
- 设置 →「版本」(格式:版本号 (构建号)),点击可查看服务器与客户端版本

@ -1 +1 @@
Subproject commit 84b9aeb38fef91b69cfe22d2956bc175745848be
Subproject commit 64e352aa5e63f13fc42963d12a2e95a142a12995

View File

@ -145,10 +145,12 @@ export default {
mounted() {
this.appInter = setInterval(this.appTimerHandler, 1000)
$A.loadVConsole()
emitter.on('checkAppUpdate', this.checkAppUpdate)
},
beforeDestroy() {
this.appInter && clearInterval(this.appInter)
emitter.off('checkAppUpdate', this.checkAppUpdate)
},
computed: {
@ -339,6 +341,51 @@ export default {
},
methods: {
/**
* App 检查更新(manual:设置页手动检查,各种结果都给提示)
* 与桌面端一致:新版本不高于服务器版本才提示,避免包内新前端调用旧服务器接口
*/
checkAppUpdate(manual = false) {
$A.eeuiAppCheckUpdate(async ({status, version, url} = {}) => {
if (status !== 'update') {
manual && (status === 'latest' ? $A.messageSuccess('已是最新版本') : $A.messageError('检查更新失败,请稍后再试'))
return
}
const serverVersion = await this.$store.dispatch("call", {url: 'system/version'}).then(({data}) => data.version).catch(() => '')
if (!serverVersion) {
manual && $A.messageError('检查更新失败,请稍后再试')
return
}
if (this.compareVersion(version, serverVersion) > 0) {
manual && $A.messageWarning('当前服务器版本较低,请等待服务器升级后再更新')
return
}
$A.modalConfirm({
language: false,
title: this.$L('发现新版本'),
content: this.$L('DooTask 新版本 (*) 已发布,建议更新以获得更好的使用体验。', version),
cancelText: this.$L('以后再说'),
okText: this.$L('立即更新'),
onOk: () => $A.eeuiAppOpenWeb(url),
})
})
},
/**
* 按数字段比较版本号,a > b 返回正数
*/
compareVersion(a, b) {
const pa = String(a).split('.').map(n => parseInt(n, 10) || 0)
const pb = String(b).split('.').map(n => parseInt(n, 10) || 0)
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
const diff = (pa[i] || 0) - (pb[i] || 0)
if (diff !== 0) {
return diff
}
}
return 0
},
appTimerHandler() {
this.searchEnter()
//
@ -674,7 +721,7 @@ export default {
const nowYmd = $A.daytz().format('YYYY-MM-DD')
if (this.lastCheckUpgradeYmd != nowYmd) {
this.lastCheckUpgradeYmd = nowYmd
$A.eeuiAppCheckUpdate();
this.checkAppUpdate();
}
}
// APP进入后台

View File

@ -152,26 +152,13 @@ import {languageName} from "../i18n";
return !!window.__eeuiBridge;
},
// 检查更新(manual:手动检查,提示已是最新/检查失败)
eeuiAppCheckUpdate(manual = false) {
// 检查更新:新版壳只查询,结果 {status, version, url} 回调给前端提示;旧 eeui 壳由原生自行处理
eeuiAppCheckUpdate(callback) {
if (!$A.eeuiAppIsExpo()) {
$A.eeuiModule()?.checkUpdate();
return;
}
$A.eeuiModule()?.checkUpdate(({status, version, url} = {}) => {
if (status === 'update') {
$A.modalConfirm({
language: false,
title: $A.L('发现新版本'),
content: $A.L('DooTask 新版本 (*) 已发布,建议更新以获得更好的使用体验。', version),
cancelText: $A.L('以后再说'),
okText: $A.L('立即更新'),
onOk: () => $A.eeuiAppOpenWeb(url),
});
} else if (manual) {
status === 'latest' ? $A.messageSuccess('已是最新版本') : $A.messageError('检查更新失败,请稍后再试');
}
});
$A.eeuiModule()?.checkUpdate(callback);
},
// 获取主题名称 light|dark

View File

@ -246,7 +246,7 @@ export default {
},
onCheckUpdate() {
$A.eeuiAppCheckUpdate(true);
emitter.emit('checkAppUpdate', true);
},
getVersion() {

View File

@ -617,8 +617,8 @@ interface DooTaskGlobal {
eeuiAppScan(callback: (text: string) => void): void;
/** 是否新版 App 壳(Expo) */
eeuiAppIsExpo(): boolean;
/** 检查更新(manual:手动检查,提示已是最新/检查失败) */
eeuiAppCheckUpdate(manual?: boolean): void;
/** 检查更新(新版壳回调 {status: 'update' | 'latest' | 'error', version, url};旧 eeui 壳由原生处理) */
eeuiAppCheckUpdate(callback?: (result: {status: 'update' | 'latest' | 'error', version?: string, url?: string}) => void): void;
/** 获取主题名称 light|dark */
eeuiAppGetThemeName(): string | undefined;
/** 判断软键盘是否可见 */