feat(ai-assistant): 支持设置悬浮按钮显示

This commit is contained in:
kuaifan 2026-07-31 03:33:04 +00:00
parent 867a305c7a
commit 5e87eb459e
22 changed files with 326 additions and 96 deletions

View File

@ -3,11 +3,11 @@
> **本文件由脚本自动生成,请勿手改。**
>
> - 生成命令: `node scripts/gen-events-map.mjs`
> - 扫描范围: `resources/assets/js` 下所有 `.js` / `.vue` 文件(共 267 个)
> - 扫描范围: `resources/assets/js` 下所有 `.js` / `.vue` 文件(共 272 个)
> - 事件总线: `resources/assets/js/store/events.js`mitt 实例)
> - 仅匹配裸 `emitter.emit/on/off(` 调用;`xxx.emitter.emit(`(如 Quill 内部 emitter不属于本总线已排除
**29** 个静态可解析事件,**121** 处 `emitter.emit/on/off` 调用。
**30** 个静态可解析事件,**124** 处 `emitter.emit/on/off` 调用。
## 事件清单
@ -15,14 +15,14 @@
- **emit10**
- `resources/assets/js/App.vue:420`
- `resources/assets/js/pages/manage.vue:1192`
- `resources/assets/js/pages/manage.vue:1199`
- `resources/assets/js/pages/manage/application.vue:1181`
- `resources/assets/js/pages/manage/application.vue:1187`
- `resources/assets/js/pages/manage.vue:1206`
- `resources/assets/js/pages/manage.vue:1213`
- `resources/assets/js/pages/manage/application.vue:1195`
- `resources/assets/js/pages/manage/application.vue:1201`
- `resources/assets/js/pages/manage/components/ChatInput/index.vue:1882`
- `resources/assets/js/pages/manage/components/DialogView/index.vue:621`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:2012`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:2020`
- `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:1219`
- **on1**
- `resources/assets/js/pages/manage/components/MeetingManager/index.vue:187`
@ -32,36 +32,45 @@
### `addTask`
- **emit3**
- `resources/assets/js/pages/manage/calendar.vue:255`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:3508`
- `resources/assets/js/pages/manage/calendar.vue:247`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:3536`
- `resources/assets/js/pages/manage/components/ProjectPanel.vue:1357`
- **on1**
- `resources/assets/js/pages/manage.vue:592`
- `resources/assets/js/pages/manage.vue:595`
- **off1**
- `resources/assets/js/pages/manage.vue:610`
- `resources/assets/js/pages/manage.vue:613`
### `aiAssistantClosed`
- **emit1**
- `resources/assets/js/components/AIAssistant/index.vue:442`
- `resources/assets/js/components/AIAssistant/index.vue:447`
- **on1**
- `resources/assets/js/components/AIAssistant/float-button.vue:154`
- `resources/assets/js/components/AIAssistant/float-button.vue:159`
- **off1**
- `resources/assets/js/components/AIAssistant/float-button.vue:162`
- `resources/assets/js/components/AIAssistant/float-button.vue:168`
### `aiAssistantFloatButtonVisibilityChanged`
- **emit1**
- `resources/assets/js/pages/manage/setting/assistant.vue:59`
- **on1**
- `resources/assets/js/components/AIAssistant/float-button.vue:161`
- **off1**
- `resources/assets/js/components/AIAssistant/float-button.vue:170`
### `aiOperationRequest`
- **emit1**
- `resources/assets/js/store/actions.js:4752`
- `resources/assets/js/store/actions.js:4890`
- **on1**
- `resources/assets/js/components/AIAssistant/float-button.vue:155`
- `resources/assets/js/components/AIAssistant/float-button.vue:160`
- **off1**
- `resources/assets/js/components/AIAssistant/float-button.vue:163`
- `resources/assets/js/components/AIAssistant/float-button.vue:169`
### `clickAgainDialog`
- **emit1**
- `resources/assets/js/components/Mobile/Tabbar.vue:182`
- `resources/assets/js/components/Mobile/Tabbar.vue:189`
- **on1**
- `resources/assets/js/pages/manage/messenger.vue:344`
- **off1**
@ -70,30 +79,30 @@
### `createGroup`
- **emit3**
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:2866`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:2894`
- `resources/assets/js/pages/manage/components/UserDetail.vue:288`
- `resources/assets/js/pages/manage/messenger.vue:1224`
- **on1**
- `resources/assets/js/pages/manage.vue:593`
- `resources/assets/js/pages/manage.vue:596`
- **off1**
- `resources/assets/js/pages/manage.vue:611`
- `resources/assets/js/pages/manage.vue:614`
### `dialogMsgPush`
- **emit1**
- `resources/assets/js/store/actions.js:4823`
- `resources/assets/js/store/actions.js:4961`
- **on2**
- `resources/assets/js/components/Mobile/Tabbar.vue:49`
- `resources/assets/js/pages/manage.vue:594`
- `resources/assets/js/components/Mobile/Tabbar.vue:50`
- `resources/assets/js/pages/manage.vue:597`
- **off2**
- `resources/assets/js/components/Mobile/Tabbar.vue:53`
- `resources/assets/js/pages/manage.vue:612`
- `resources/assets/js/components/Mobile/Tabbar.vue:54`
- `resources/assets/js/pages/manage.vue:615`
### `handleMoveTop`
- **emit2**
- `resources/assets/js/store/actions.js:2698`
- `resources/assets/js/store/actions.js:3691`
- `resources/assets/js/store/actions.js:2810`
- `resources/assets/js/store/actions.js:3803`
- **on2**
- `resources/assets/js/pages/manage/components/DialogModal.vue:41`
- `resources/assets/js/pages/manage/components/TaskModal.vue:49`
@ -106,56 +115,56 @@
- **emit1**
- `resources/assets/js/components/AIAssistant/action-executor.js:234`
- **on1**
- `resources/assets/js/components/MicroApps/index.vue:145`
- `resources/assets/js/components/MicroApps/index.vue:203`
- **off1**
- `resources/assets/js/components/MicroApps/index.vue:151`
- `resources/assets/js/components/MicroApps/index.vue:209`
### `observeMicroApp:open`
- **emit1**
- `resources/assets/js/store/actions.js:5321`
- `resources/assets/js/store/actions.js:5468`
- **on1**
- `resources/assets/js/components/MicroApps/index.vue:144`
- `resources/assets/js/components/MicroApps/index.vue:202`
- **off1**
- `resources/assets/js/components/MicroApps/index.vue:150`
- `resources/assets/js/components/MicroApps/index.vue:208`
### `observeMicroApp:updatedOrUninstalled`
- **emit1**
- `resources/assets/js/store/mutations.js:429`
- `resources/assets/js/store/mutations.js:452`
- **on1**
- `resources/assets/js/components/MicroApps/index.vue:146`
- `resources/assets/js/components/MicroApps/index.vue:204`
- **off1**
- `resources/assets/js/components/MicroApps/index.vue:152`
- `resources/assets/js/components/MicroApps/index.vue:210`
### `openAIAssistant`
- **emit7**
- `resources/assets/js/components/AIAssistant/float-button.vue:476`
- `resources/assets/js/components/AIAssistant/float-button.vue:508`
- `resources/assets/js/components/SearchBox.vue:582`
- `resources/assets/js/pages/manage.vue:1223`
- `resources/assets/js/pages/manage.vue:1237`
- `resources/assets/js/pages/manage/components/ChatInput/index.vue:1925`
- `resources/assets/js/pages/manage/components/ReportDetail.vue:176`
- `resources/assets/js/pages/manage/components/ReportEdit.vue:267`
- `resources/assets/js/pages/manage/components/TaskAdd.vue:710`
- **on1**
- `resources/assets/js/components/AIAssistant/index.vue:382`
- `resources/assets/js/components/AIAssistant/index.vue:387`
- **off1**
- `resources/assets/js/components/AIAssistant/index.vue:389`
- `resources/assets/js/components/AIAssistant/index.vue:394`
### `openAIAssistantGlobal`
- **emit1**
- `resources/assets/js/pages/manage.vue:1211`
- `resources/assets/js/pages/manage.vue:1225`
- **on1**
- `resources/assets/js/components/AIAssistant/float-button.vue:153`
- `resources/assets/js/components/AIAssistant/float-button.vue:158`
- **off1**
- `resources/assets/js/components/AIAssistant/float-button.vue:161`
- `resources/assets/js/components/AIAssistant/float-button.vue:167`
### `openDownloadClient`
- **emit1**
- `resources/assets/js/pages/manage.vue:1092`
- `resources/assets/js/pages/manage.vue:1106`
- **on1**
- `resources/assets/js/components/RightBottom.vue:73`
- **off1**
@ -164,25 +173,25 @@
### `openFavorite`
- **emit1**
- `resources/assets/js/pages/manage/application.vue:1054`
- `resources/assets/js/pages/manage/application.vue:1068`
- **on1**
- `resources/assets/js/pages/manage.vue:596`
- `resources/assets/js/pages/manage.vue:599`
- **off1**
- `resources/assets/js/pages/manage.vue:614`
- `resources/assets/js/pages/manage.vue:617`
### `openManageExport`
- **emit1**
- `resources/assets/js/pages/manage/application.vue:1101`
- `resources/assets/js/pages/manage/application.vue:1115`
- **on1**
- `resources/assets/js/pages/manage.vue:598`
- `resources/assets/js/pages/manage.vue:601`
- **off1**
- `resources/assets/js/pages/manage.vue:616`
- `resources/assets/js/pages/manage.vue:619`
### `openMobileNotification`
- **emit1**
- `resources/assets/js/pages/manage.vue:1597`
- `resources/assets/js/pages/manage.vue:1611`
- **on1**
- `resources/assets/js/components/Mobile/Notification.vue:38`
- **off1**
@ -200,25 +209,25 @@
### `openRecent`
- **emit1**
- `resources/assets/js/pages/manage/application.vue:1057`
- `resources/assets/js/pages/manage/application.vue:1071`
- **on1**
- `resources/assets/js/pages/manage.vue:597`
- `resources/assets/js/pages/manage.vue:600`
- **off1**
- `resources/assets/js/pages/manage.vue:615`
- `resources/assets/js/pages/manage.vue:618`
### `openReport`
- **emit1**
- `resources/assets/js/pages/manage/application.vue:1051`
- `resources/assets/js/pages/manage/application.vue:1065`
- **on1**
- `resources/assets/js/pages/manage.vue:595`
- `resources/assets/js/pages/manage.vue:598`
- **off1**
- `resources/assets/js/pages/manage.vue:613`
- `resources/assets/js/pages/manage.vue:616`
### `openSearch`
- **emit1**
- `resources/assets/js/pages/manage/dashboard.vue:256`
- `resources/assets/js/pages/manage/dashboard.vue:784`
- **on1**
- `resources/assets/js/components/SearchBox.vue:128`
- **off1**
@ -228,8 +237,8 @@
- **emit4**
- `resources/assets/js/components/UserAvatar/index.vue:184`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:2935`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:4485`
- `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:1229`
- **on1**
- `resources/assets/js/pages/manage/components/UserDetail.vue:166`
@ -242,33 +251,33 @@
- `resources/assets/js/pages/manage/components/ProjectPanel.vue:1775`
- `resources/assets/js/pages/manage/components/TaskRow.vue:280`
- **on1**
- `resources/assets/js/pages/manage/components/TaskDetail.vue:738`
- `resources/assets/js/pages/manage/components/TaskDetail.vue:744`
- **off1**
- `resources/assets/js/pages/manage/components/TaskDetail.vue:745`
- `resources/assets/js/pages/manage/components/TaskDetail.vue:751`
### `streamMsgData`
- **emit1**
- `resources/assets/js/store/actions.js:4440`
- `resources/assets/js/store/actions.js:4578`
- **on1**
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:943`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:944`
- **off1**
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:953`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:954`
### `taskRelationUpdate`
- **emit1**
- `resources/assets/js/store/actions.js:4963`
- `resources/assets/js/store/actions.js:5101`
- **on1**
- `resources/assets/js/pages/manage/components/TaskDetail.vue:739`
- `resources/assets/js/pages/manage/components/TaskDetail.vue:745`
- **off1**
- `resources/assets/js/pages/manage/components/TaskDetail.vue:746`
- `resources/assets/js/pages/manage/components/TaskDetail.vue:752`
### `updateNotification`
- **emit2**
- `resources/assets/js/pages/manage.vue:1089`
- `resources/assets/js/pages/manage/setting/index.vue:191`
- `resources/assets/js/pages/manage.vue:1103`
- `resources/assets/js/pages/manage/setting/index.vue:206`
- **on1**
- `resources/assets/js/components/RightBottom.vue:65`
- **off1**
@ -286,9 +295,9 @@
### `userActive`
- **emit3**
- `resources/assets/js/store/actions.js:841`
- `resources/assets/js/store/actions.js:923`
- `resources/assets/js/store/actions.js:4740`
- `resources/assets/js/store/actions.js:857`
- `resources/assets/js/store/actions.js:939`
- `resources/assets/js/store/actions.js:4878`
- **on1**
- `resources/assets/js/components/UserAvatar/index.vue:43`
- **off1**
@ -297,23 +306,23 @@
### `websocketMsg`
- **emit1**
- `resources/assets/js/store/actions.js:4757`
- `resources/assets/js/store/actions.js:4895`
- **on2**
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:942`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:943`
- `resources/assets/js/pages/manage/components/FileContent.vue:202`
- **off2**
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:954`
- `resources/assets/js/pages/manage/components/DialogWrapper.vue:955`
- `resources/assets/js/pages/manage/components/FileContent.vue:225`
## 动态事件名(无法静态解析)
以下调用的第一参数不是字符串字面量,无法静态解析事件名:
- `resources/assets/js/components/MicroApps/index.vue:375` — `emitter.emit(actionName...)`
- `resources/assets/js/components/MicroApps/index.vue:448` — `emitter.emit(actionName...)`
## 统计
- 事件总数(静态可解析): **29**
- 事件总数(静态可解析): **30**
- 只 emit 无 on疑似死事件: **0**
- 只 on 无 emit无人发射: **0**
- 动态事件名调用: **1**

View File

@ -2656,3 +2656,5 @@ LDAP 用户禁止修改邮箱
[weekday].四
[weekday].五
[weekday].六
AI 助手设置
显示悬浮按钮

View File

@ -38326,5 +38326,29 @@
"fr": "Aucune donnée de service à afficher",
"id": "Tidak ada data departemen yang dapat dilihat",
"ru": "Нет данных отдела для просмотра"
},
{
"key": "AI 助手设置",
"zh": "",
"zh-CHT": "AI 助手設定",
"en": "AI Assistant Settings",
"ko": "AI 어시스턴트 설정",
"ja": "AIアシスタント設定",
"de": "KI-Assistent-Einstellungen",
"fr": "Paramètres de lassistant IA",
"id": "Pengaturan Asisten AI",
"ru": "Настройки ИИ-помощника"
},
{
"key": "显示悬浮按钮",
"zh": "",
"zh-CHT": "顯示懸浮按鈕",
"en": "Show floating button",
"ko": "플로팅 버튼 표시",
"ja": "フローティングボタンを表示",
"de": "Schwebende Schaltfläche anzeigen",
"fr": "Afficher le bouton flottant",
"id": "Tampilkan tombol mengambang",
"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

@ -479,13 +479,14 @@ features:
scope: end-user
batch: B4
priority: P0
chunk_count_est: 12
chunk_count_est: 13
owner: ~
status: drafted
chunks:
- user-settings.privacy.concept
- user-settings.shortcut.concept
- user-settings.app-sort.howto
- user-settings.ai-assistant-float.howto
- user-settings.checkin.howto
- user-settings.email.howto
- user-settings.language.howto

View File

@ -0,0 +1,45 @@
---
id: user-settings.ai-assistant-float.howto
title: 显示或隐藏 AI 助手悬浮按钮
type: howto
feature: user-settings
scope: end-user
locale: zh
aliases:
- 怎么关闭 AI 浮球
- 隐藏 AI 助手按钮
- 恢复 AI 助手浮球
- AI 悬浮按钮设置
related_tools: []
related_pages: [setting]
prerequisites:
- 应用市场已安装 ai 插件
negative:
- 隐藏悬浮按钮不会禁用 AI 助手或卸载 ai 插件
- 未安装 ai 插件时不显示「AI 助手设置」菜单
last_verified: v1.8.89
---
# 显示或隐藏 AI 助手悬浮按钮
## 入口
- 桌面端 Web / Electron右上角头像 →「设置」→「AI 助手设置」
- 移动端:底部 Tabbar「我的」→「设置」→「AI 助手设置」
- 只有系统已安装 ai 插件时,设置菜单才会出现。
## 操作步骤
1. 进入「AI 助手设置」。
2. 打开或关闭「显示悬浮按钮」开关。
3. 点击「提交」保存并应用;点击「重置」可恢复进入页面时的值。
4. 关闭后如需恢复,返回同一页面重新打开开关并提交。
## 影响范围
该设置按当前账号保存在当前设备。关闭后只隐藏页面侧边的 AI 助手浮球,不影响右上角「+ → AI 助手」、Cmd/Ctrl + I 快捷键,也不影响项目、任务和汇报等页面中的 AI 功能。清除客户端缓存后,该开关会恢复为默认开启。
## 相关
- AI 助手的其他入口:[[menu-navigation.ai-assistant.menu-map]]
- 个人设置入口:[[user-settings.entry.menu-map]]

View File

@ -17,10 +17,11 @@ prerequisites:
- 应用市场已安装 ai 插件
- 管理员已在「系统设置 → AI 设置」配置至少一个模型
negative:
- 未安装 ai 插件时右上「+」菜单不出现「AI 助手」一项,浮动按钮也不渲染
- 未安装 ai 插件时右上「+」菜单不出现「AI 助手」一项,悬浮按钮也不渲染
- 用户可在「设置 → AI 助手设置」关闭悬浮按钮,关闭后其他入口仍可使用
- 没有左侧栏一级菜单AI 助手是浮窗形态
- 移动端首次加载会自动收起浮按钮
last_verified: v1.7.90
last_verified: v1.8.89
---
# AI 助手入口在哪
@ -32,6 +33,8 @@ last_verified: v1.7.90
- 移动端:屏幕侧边浮动按钮(默认贴边收起,触摸唤起)
- 桌面快捷键Cmd/Ctrl + I
悬浮按钮可在「设置 → AI 助手设置」中显示或隐藏,详见 [[user-settings.ai-assistant-float.howto]]。
## 权限要求
- 任何登录用户可用
- 单个会话由当前账号私有,不会跨账号

View File

@ -18,7 +18,7 @@ prerequisites: []
negative:
- 个人设置没有移动端 Tabbar 一级入口,需先进「我的」再进设置
- 未登录用户没有「个人设置」入口
last_verified: v1.7.90
last_verified: v1.8.89
---
# 个人设置入口
@ -40,6 +40,7 @@ last_verified: v1.7.90
- 语言设置 → [[user-settings.language.howto]]
- 主题设置 → [[user-settings.theme.howto]]
- 键盘设置(仅 Electron / 移动端)→ [[user-settings.shortcut.concept]]
- AI 助手设置(仅安装 ai 插件后显示)→ [[user-settings.ai-assistant-float.howto]]
- 系统设置 / License Key仅系统管理员可见
- 更新日志 / 版本 / 登录设备 / 清除缓存 / 退出登录

View File

@ -0,0 +1,17 @@
function cacheKey(userId) {
return `aiAssistant.floatButtonVisible.${userId}`;
}
export function loadFloatButtonVisible(userId) {
if (userId <= 0) {
return Promise.resolve(true);
}
return $A.IDBBoolean(cacheKey(userId), true).catch(() => true);
}
export function saveFloatButtonVisible(userId, visible) {
if (userId <= 0) {
return Promise.resolve();
}
return $A.IDBSet(cacheKey(userId), visible);
}

View File

@ -27,6 +27,7 @@
import {mapState} from "vuex";
import emitter from "../../store/events";
import {createOperationModule} from "./operation-module";
import {loadFloatButtonVisible} from "./float-button-preference";
export default {
name: 'AIAssistantFloatButton',
@ -43,6 +44,8 @@ export default {
},
dragging: false,
positionLoaded: false,
visibilityLoaded: false,
floatButtonVisible: true,
cacheKey: 'aiAssistant.floatButtonPosition',
btnSize: 44,
collapsedHeight: 48, //
@ -68,6 +71,8 @@ export default {
return this.aiInstalled &&
this.userId > 0 &&
this.positionLoaded &&
this.visibilityLoaded &&
this.floatButtonVisible &&
this.routeName !== 'login' &&
!this.$parent?.showModal;
},
@ -153,6 +158,7 @@ export default {
emitter.on('openAIAssistantGlobal', this.onClick);
emitter.on('aiAssistantClosed', this.onAssistantClosed);
emitter.on('aiOperationRequest', this.onOperationRequest);
emitter.on('aiAssistantFloatButtonVisibilityChanged', this.onVisibilityChanged);
this.initOperationModule();
},
@ -161,6 +167,7 @@ export default {
emitter.off('openAIAssistantGlobal', this.onClick);
emitter.off('aiAssistantClosed', this.onAssistantClosed);
emitter.off('aiOperationRequest', this.onOperationRequest);
emitter.off('aiAssistantFloatButtonVisibilityChanged', this.onVisibilityChanged);
document.removeEventListener('mousemove', this.onMouseMove);
document.removeEventListener('mouseup', this.onMouseUp);
document.removeEventListener('contextmenu', this.onContextMenu);
@ -171,7 +178,32 @@ export default {
this.destroyOperationModule();
},
watch: {
userId: {
handler(userId) {
this.loadVisibility(userId);
},
immediate: true,
},
},
methods: {
async loadVisibility(userId) {
this.visibilityLoaded = false;
const visible = await loadFloatButtonVisible(userId);
if (this.userId === userId) {
this.floatButtonVisible = visible;
this.visibilityLoaded = userId > 0;
}
},
onVisibilityChanged({userId, visible}) {
if (this.userId === userId) {
this.floatButtonVisible = visible;
this.visibilityLoaded = true;
}
},
/**
* 加载保存的位置
*/

View File

@ -0,0 +1,76 @@
<template>
<div class="setting-item submit">
<Form ref="formData" :model="formData" v-bind="formOptions" @submit.native.prevent>
<FormItem :label="$L('显示悬浮按钮')">
<iSwitch
v-model="formData.floatButtonVisible"
:disabled="loading"/>
</FormItem>
</Form>
<div class="setting-footer">
<Button :loading="loadIng > 0" :disabled="loading" type="primary" @click="submitForm">{{$L('提交')}}</Button>
<Button :loading="loadIng > 0" :disabled="loading" @click="resetForm">{{$L('重置')}}</Button>
</div>
</div>
</template>
<script>
import {mapState} from "vuex";
import emitter from "../../../store/events";
import {
loadFloatButtonVisible,
saveFloatButtonVisible,
} from "../../../components/AIAssistant/float-button-preference";
export default {
data() {
return {
loadIng: 0,
loading: true,
formData: {
floatButtonVisible: true,
},
};
},
computed: {
...mapState(['userId', 'formOptions']),
},
mounted() {
this.loadPreference();
},
methods: {
async loadPreference() {
try {
this.$set(this.formData, 'floatButtonVisible', await loadFloatButtonVisible(this.userId));
this.formData_bak = $A.cloneJSON(this.formData);
} finally {
this.loading = false;
}
},
async submitForm() {
const visible = this.formData.floatButtonVisible;
this.loadIng++;
try {
await saveFloatButtonVisible(this.userId, visible);
emitter.emit('aiAssistantFloatButtonVisibilityChanged', {
userId: this.userId,
visible,
});
$A.messageSuccess('保存成功');
} catch (error) {
$A.modalError(error.message);
} finally {
this.loadIng--;
}
},
resetForm() {
this.formData = $A.cloneJSON(this.formData_bak);
},
},
};
</script>

View File

@ -72,7 +72,11 @@ export default {
},
computed: {
...mapState(['userInfo', 'userIsAdmin', 'clientNewVersion', 'systemConfig']),
...mapState(['userInfo', 'userIsAdmin', 'clientNewVersion', 'systemConfig', 'microAppsIds']),
aiInstalled() {
return this.microAppsIds?.includes('ai');
},
showContent() {
return this.$route.path.match(/^\/manage\/setting\/\w+$/)
@ -91,6 +95,10 @@ export default {
menu.push({path: 'keyboard', name: '键盘设置'})
}
if (this.aiInstalled) {
menu.push({path: 'assistant', name: 'AI 助手设置'})
}
if ($A.isDooServer() && this.$isEEUIApp) {
menu.push(...[
{path: 'privacy', name: '隐私政策', divided: true},
@ -139,10 +147,17 @@ export default {
handler(name) {
if (name === 'manage-setting' && this.windowLandscape) {
this.goForward({name: 'manage-setting-personal'}, true);
} else if (name === 'manage-setting-assistant' && !this.aiInstalled) {
this.goForward({name: 'manage-setting-personal'}, true);
}
},
immediate: true
}
},
microAppsIds() {
if (this.routeName === 'manage-setting-assistant' && !this.aiInstalled) {
this.goForward({name: 'manage-setting-personal'}, true);
}
},
},
methods: {

View File

@ -64,6 +64,11 @@ export default [
path: 'keyboard',
component: () => import('./pages/manage/setting/keyboard.vue'),
},
{
name: 'manage-setting-assistant',
path: 'assistant',
component: () => import('./pages/manage/setting/assistant.vue'),
},
{
name: 'manage-setting-license',
path: 'license',