Ver Fonte

[Mod 0000] AI助手思考面板增加管理员权限

wangkeyi há 3 dias atrás
pai
commit
9b128e34ba

+ 5 - 9
src/views/ventAI/manageAssistent/components/chat/ChatInputArea.vue

@@ -79,16 +79,12 @@
         <ContextRing :used="contextUsed" :max="contextMax" :percent="contextPercent" :breakdown="contextBreakdown" />
         <div class="action-divider"></div>
         <UsageRing :limit="usageLimit" :spent="usageSpent" :remaining="usageRemaining" :by-model="usageByModel" />
-        <!-- [审计-第四轮 M3] 重放自我方 fix/base-agent-token(M1/M2/M3):思考级别切换控件对非管理员隐藏。
-             原行为:任何角色都能看到并使用「思考级别」切换(TfAgents 已将其列为全局变更端点)。
-             现行为:ThinkLevelPopup 连同它前面的 .action-divider 一起包 v-if="isAdmin"(注意必须连分隔线
-                     一起隐藏,否则非管理员会残留一根竖线);后面的 .action-divider 保留,发送按钮布局不变。
-             为什么:入口可见性收敛到管理员;不改 ThinkLevelPopup 组件内部(可能被别处复用)。
+        <!-- 思考级别对非管理员改为「可见但只读」:控件本身还承担「当前是什么级别」的信息,
+             藏掉就看不到了;因此保留显示、由组件内部拦住展开与切换(不会触发切换接口)。
+             控件常驻后它前面的 .action-divider 也常驻,不会再出现「隐藏控件残留一根竖线」的问题。
              思考级别的"读取"(getModelMsg)不受影响,对所有人依旧可用。 -->
-        <template v-if="isAdmin">
-          <div class="action-divider"></div>
-          <ThinkLevelPopup :initial-level="initialThinkLevel" @change="emit('think-level-change', $event)" />
-        </template>
+        <div class="action-divider"></div>
+        <ThinkLevelPopup :initial-level="initialThinkLevel" :disabled="!isAdmin" @change="emit('think-level-change', $event)" />
         <div class="action-divider"></div>
         <div class="btn-send" :class="{ disabled: !streaming && (!modelValue.trim() || loading) }" @click="handleSendClick">
           <div class="send-icon" :class="{ 'stop-icon': streaming }"></div>

+ 24 - 3
src/views/ventAI/manageAssistent/components/chat/Input/ThinkLevelPopup.vue

@@ -1,8 +1,8 @@
 <template>
   <!-- 思考级别选择器:关闭 / 高 / 最高 -->
   <div class="btn-think-wrapper" ref="wrapperRef">
-    <a-tooltip title="思考级别">
-      <div class="btn-think" @click="togglePopup">
+    <a-tooltip :title="props.disabled ? '思考级别(只读:仅管理员可修改)' : '思考级别'">
+      <div class="btn-think" :class="{ 'is-readonly': props.disabled }" @click="togglePopup">
         <div class="btn-icon think-icon"></div>
         <span class="btn-text">{{ selected.label }}</span>
         <div class="btn-arrow"></div>
@@ -32,8 +32,14 @@
 
   /**
    * 思考级别选择器。选中项是本组件状态(仅供展示),切换时通过 change 事件通知父组件调接口。
+   *
+   * disabled 用于「非管理员只读」:控件仍然显示(当前级别本身是需要被看到的状态),
+   * 但不展开菜单、不派发 change,因此不会触发切换接口。
    */
-  const props = withDefaults(defineProps<{ initialLevel?: string }>(), { initialLevel: 'off' });
+  const props = withDefaults(defineProps<{ initialLevel?: string; disabled?: boolean }>(), {
+    initialLevel: 'off',
+    disabled: false,
+  });
   const emit = defineEmits<{
     (e: 'change', key: string): void;
   }>();
@@ -58,10 +64,14 @@
   );
 
   const togglePopup = () => {
+    // 只读:不展开菜单(展示当前级别即可,不允许改)
+    if (props.disabled) return;
     showPopup.value = !showPopup.value;
   };
 
   const selectItem = (item: ThinkLevelOption) => {
+    // 只读:不派发 change,避免触发切换接口
+    if (props.disabled) return;
     selected.value = item;
     showPopup.value = false;
     emit('change', item.key);
@@ -118,6 +128,17 @@
       border-color: #3a8fd4;
       background: rgba(10, 132, 255, 0.1);
     }
+
+    /* 只读态:保留可读的当前级别,但不给出可点击的反馈 */
+    &.is-readonly {
+      cursor: not-allowed;
+      opacity: 0.6;
+
+      &:hover {
+        border-color: transparent;
+        background: transparent;
+      }
+    }
   }
   .think-popup {
     position: absolute;