diff --git a/src/assets/styles/header.scss b/src/assets/styles/header.scss
index 98f3eac..62e1a98 100644
--- a/src/assets/styles/header.scss
+++ b/src/assets/styles/header.scss
@@ -181,6 +181,14 @@
text-overflow: ellipsis;
white-space: nowrap;
}
+/* 应用类型:右侧灰字(来源 BoaAppType.name,与 /apps 分组标题同源) */
+.app-cmdk-type {
+ flex-shrink: 0;
+ font-size: 11.5px;
+ color: #98a2b0;
+ font-weight: 400;
+ white-space: nowrap;
+}
.app-cmdk-empty {
display: none;
padding: 28px 18px 32px;
diff --git a/src/components/Header.vue b/src/components/Header.vue
index a95c48e..6cdfb70 100644
--- a/src/components/Header.vue
+++ b/src/components/Header.vue
@@ -208,6 +208,7 @@
/>
{{ item.name }}
+ {{ item.appTypeName }}
@@ -409,9 +410,10 @@ onUnmounted(() => {
window.removeEventListener("keydown", onCmdkKeydown);
closeMsgWs();
});
-watch(searchAppText, val => {
+// 面板已是模态框,输入只驱动面板自身过滤;
+// 不再 emit("searchChange") —— 背景应用网格保持原样(2026-10-08 用户修订 1)
+watch(searchAppText, () => {
cmdkStagger.value = false; // 输入过滤时不重播逐条入场
- mittBus.emit("searchChange", val);
});
// ===== 搜索命令面板(2026-10-08 定稿 B 方案)=====
const refCmdkList = ref
();
@@ -425,12 +427,21 @@ function vectorIconOf(item: any): string {
return appiconKeyOf(item?.name || "");
}
-/** 结果取自 store(由 AppList.reloadAppData 写入),与背景应用网格同源同口径 */
+/** 结果取自 store.curUserAppList(写入方 = AppList.reloadAppData)。
+ * 它是 BoaAppType 分组结构 [{ id, name, apps }],name 就是应用类型名;
+ * 展开时把类型名挂到每条上供右侧灰字展示。
+ * 注意别用 store.getFlattenAppList —— 它是纯 flatten,会把类型名丢掉 */
const cmdkResult = computed(() => {
- const all = store.getFlattenAppList;
const q = (searchAppText.value || "").trim();
- if (!q) return all;
- return all.filter((x: any) => x.name.indexOf(q) !== -1);
+ const out: any[] = [];
+ (store.curUserAppList || []).forEach((group: any) => {
+ (group.apps || []).forEach((app: any) => {
+ if (!q || (app.name || "").indexOf(q) !== -1) {
+ out.push({ ...app, appTypeName: group.name });
+ }
+ });
+ });
+ return out;
});
function openSearch() {
diff --git a/src/harness-main.ts b/src/harness-main.ts
index 88009e4..f365661 100644
--- a/src/harness-main.ts
+++ b/src/harness-main.ts
@@ -78,12 +78,18 @@ function applyMockState() {
],
curUserAppList: [
{
+ id: 1,
+ name: "常用应用",
apps: [
{ appKey: "100019", appCode: "flow", name: "流程中心" },
{ appKey: "100617", appCode: "notice", name: "通知公告" },
- { appKey: "100611", appCode: "leave", name: "请假" },
],
},
+ {
+ id: 2,
+ name: "教学应用",
+ apps: [{ appKey: "100611", appCode: "leave", name: "请假" }],
+ },
],
unreadCount: 5,
curUserSettingInfo: {
diff --git a/src/utils/mitt.ts b/src/utils/mitt.ts
index 0bef37a..f33501c 100644
--- a/src/utils/mitt.ts
+++ b/src/utils/mitt.ts
@@ -11,7 +11,6 @@ type MittType = {
openBschIframePage: IframePageParmas; //打开iframe页面
showLightAppModal: LightAppModal; //打开lightapp模态框
searchReset: void; //重置搜索框
- searchChange: string | null;
};
// 类型
diff --git a/src/views/AppList.vue b/src/views/AppList.vue
index 5f30b01..d8cadcc 100644
--- a/src/views/AppList.vue
+++ b/src/views/AppList.vue
@@ -1,7 +1,7 @@
-
+
{{ item.name }}
-
-
-
![]()
-
-
@@ -86,11 +50,9 @@ import vuescroll from "vuescroll";
import { ref, onMounted, onUnmounted, computed, watch } from "vue";
import BaseApi from "@/api/BaseApi";
import { useDefaultStore } from "@/store";
-import { requireImg } from "@/utils/hook/useImg";
import mittBus from "@/utils/mitt";
import { useRoute, useRouter } from "vue-router";
import { BschLoadTypeEnum, DesktopAppTypeEnum, LinkOpenTypeEnum } from "@/types";
-import { flatten } from "lodash";
import UserSettingApi from "@/api/UserSettingApi";
import { Message } from "view-ui-plus";
import { bschLinkPage, openAppPage } from "@/utils/bschLinkPage";
@@ -120,15 +82,8 @@ const router = useRouter();
const store = useDefaultStore();
const { $conf, $utils } = useCurrentInstance();
-const searchAppText = ref(null),
- appList = ref([]);
+const appList = ref([]);
-const searchAppList = computed(() => {
- const allAppList = flatten(appList.value.map(x => x.apps));
- return allAppList.filter(x => x.name.indexOf(searchAppText.value) !== -1);
-});
-
-const isSearch = computed(() => !!searchAppText.value);
const compMenuId = computed(() => {
let menuList = store.curUserMenuList.find(x => x.url == route.path);
return menuList ? menuList.id : -1;
@@ -137,13 +92,9 @@ const compMenuId = computed(() => {
onMounted(() => {
reloadAppData();
mittBus.emit("searchReset");
- mittBus.on("searchChange", val => {
- searchAppText.value = val;
- });
});
onUnmounted(() => {
mittBus.emit("searchReset");
- mittBus.off("searchChange");
});
watch(() => store.curRoleUid, reloadAppData);
@@ -237,11 +188,4 @@ function linkPage(item: any) {
flex-wrap: wrap;
}
}
-.no-search-box {
- text-align: center;
- position: relative;
- top: -50%;
- -webkit-transform: translateY(40%);
- transform: translateY(40%);
-}