更新记录

1.0.1(2025-08-03) 下载此版本

v1.0.1

  • ✅ 基础浮动按钮功能
  • ✅ 位置拖拽和同步
  • ✅ 聊天窗口UI
  • ✅ 跨页面状态管理
  • ✅ 位置持久化存储
  • ✅ 深色模式支持

1.0.0(2025-08-02) 下载此版本

v1.0.0

  • ✅ 基础浮动按钮功能
  • ✅ 位置拖拽和同步
  • ✅ 聊天窗口UI
  • ✅ 跨页面状态管理
  • ✅ 位置持久化存储
  • ✅ 深色模式支持

平台兼容性

uni-app(4.25)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - -

其他

多语言 暗黑模式 宽屏模式
×

AI浮动按钮聊天窗口组件

一个功能完整的AI智能助手浮动按钮组件,支持跨页面位置同步、聊天窗口状态管理,适用于uni-app项目。

安装

下载zip包,导入到项目按照说明一步步配置即可,需要移植组件直接复制文件到项目按照结构说明配置即可。

功能特性

智能浮动按钮

  • 可拖拽调整任意位置,无自动吸附
  • 跨页面位置同步
  • 自动边界检测
  • 位置持久化存储

聊天窗口管理

  • 现代化UI设计
  • 跨页面状态同步
  • 切换页面自动关闭机制
  • 页面切换智能管理

AI对话功能

  • 支持连续对话
  • 消息历史记录
  • 快捷问题建议
  • 错误重试机制

响应式设计

  • 深色模式适配
  • 多设备兼容
  • 流畅动画效果
  • 无障碍访问支持

项目参考结构

ZH-AiChatButton/
├── components/
│   └── ZH-AiChatButton/
│       └── ZH-AiChatButton.vue          # AI聊天组件主文件
├── common/
│   ├── aiFloatManager.js        # 位置管理器(核心)
│   └── aiFloatMixin.js          # Vue混入(可选)
├── pages/
│   └── index/
│       ├── index.vue            # 示例页面
│       ├── data.vue             # 示例页面
│       └── me.vue               # 示例页面
└── main.js                      # 应用入口

必需的依赖

uni-popup 组件

项目使用了 uni-ui 的 uni-popup 弹窗组件来实现聊天窗口的显示,请先安装uni-ui。

ColorUI 图标库

项目使用了 ColorUI 的图标库来显示各种图标,请先配置好colorUI以保障组件图标正常显示,当然也可根据需求自己替换其他图标库。

快速开始

1. 安装配置

方法一:直接使用aiFloatManager(推荐此方法)

main.js 中全局注册:

import Vue from 'vue'
import aiFloatManager from '@/common/aiFloatManager.js'

// 挂载到Vue原型,全局可用
Vue.prototype.$aiFloatManager = aiFloatManager

方法二:使用aiFloatMixin(可选)

// 在页面中导入并使用
import aiFloatMixin from '@/common/aiFloatMixin.js'

export default {
    mixins: [aiFloatMixin],
    // 自动获得位置同步功能
}

2. 在页面中使用

<template>
    <view class="page">
        <!-- 你的页面内容 -->

        <!-- AI聊天组件 -->
        <ai-chat :pageType="'index'"></ai-chat>
    </view>
</template>

<script>
import AiChat from '@/components/ZH-AiChatButton/ZH-AiChatButton.vue'

export default {
    components: {
        AiChat
    },

    onShow() {
        // 通知管理器当前页面状态(重要!)
        if (this.$aiFloatManager) {
            this.$aiFloatManager.setActivePageType('index');
        }
    }
}
</script>

核心组件详解

aiFloatManager.js - 位置管理器

核心管理器,提供位置同步和聊天状态管理功能。

主要功能

// 获取管理器实例(已在main.js中全局注册)
const manager = this.$aiFloatManager;

// 位置管理
manager.getPosition()                    // 获取当前位置
manager.updatePosition({top: 100, right: 20})  // 更新位置
manager.safeUpdatePosition(position)     // 安全更新(带边界检测)
manager.resetPosition()                  // 重置到默认位置

// 位置订阅
const unsubscribe = manager.subscribe((newPosition) => {
    console.log('位置变化:', newPosition);
});

// 聊天状态管理
manager.setChatWindowState(true, 'index')  // 设置聊天窗口状态
manager.setActivePageType('index')         // 设置活跃页面
manager.getChatWindowState()               // 获取聊天状态
manager.shouldShowChatWindow('index')      // 判断是否显示聊天窗口

自动功能

  • 位置持久化:自动保存到本地存储
  • 边界检测:防止按钮超出屏幕范围
  • 跨页面同步:所有页面位置实时同步
  • 智能关闭:页面切换时自动关闭聊天窗口

aiFloatMixin.js - Vue混入(可选)

为Vue组件提供便捷的位置管理功能。

提供的数据和方法

// 自动提供的响应式数据
this.aiFloatPosition          // 当前位置 {top, right}

// 自动提供的方法
this.updateAIFloatPosition(pos)  // 更新位置
this.resetAIFloatPosition()      // 重置位置
this.getAIFloatPosition()        // 获取位置

// 自动管理的生命周期
// mounted: 自动订阅位置变化
// beforeDestroy: 自动取消订阅

使用示例

export default {
    mixins: [aiFloatMixin],

    mounted() {
        // 位置数据已自动同步到 this.aiFloatPosition
        console.log('当前位置:', this.aiFloatPosition);
    },

    methods: {
        handlePositionChange() {
            // 更新位置
            this.updateAIFloatPosition({top: 200, right: 30});
        }
    }
}

ZH-AiChatButton.vue - AI聊天组件

完整的AI聊天组件,包含浮动按钮和聊天窗口。

组件属性

// props
pageType: {
    type: String,
    default: 'general'    // 页面类型: general, index, me, data
}

主要功能

  • 浮动按钮:可拖拽、可点击、脉冲动画
  • 聊天窗口:现代化UI、消息历史、快捷问题
  • 位置同步:自动同步管理器位置
  • 状态管理:自动处理聊天窗口状态

内置方法

// 聊天相关
this.showAIChat()           // 显示聊天窗口
this.closeAIChat()          // 关闭聊天窗口
this.sendMessage()          // 发送消息
this.clearChatHistory()     // 清空聊天记录

// 位置相关
this.handleTouchMove()      // 处理拖拽
this.syncPosition()         // 手动同步位置

使用场景和最佳实践

场景1:简单使用(推荐)

适合大多数项目,使用aiFloatManager即可:

// main.js
Vue.prototype.$aiFloatManager = aiFloatManager

// 页面中
export default {
    components: { AiChat },
    onShow() {
        this.$aiFloatManager.setActivePageType(this.pageType);
    }
}

场景2:复杂位置管理

需要频繁操作位置时,使用aiFloatMixin:

export default {
    mixins: [aiFloatMixin],
    components: { AiChat },

    template: `
        <ai-chat 
            :position="aiFloatPosition"
            @position-change="updateAIFloatPosition"
        />
    `
}

场景3:自定义页面类型

根据页面功能定制AI助手:

// 不同页面类型有不同的快捷问题和欢迎语
<ai-chat :pageType="'index'"></ai-chat>     // 首页
<ai-chat :pageType="'me'"></ai-chat>        // 个人中心
<ai-chat :pageType="'data'"></ai-chat>      // 数据页面

配置选项

默认位置设置

// 在aiFloatManager.js中修改
this.position = { top: 300, right: 15 };  // 默认位置

边界限制

// 在validatePosition方法中调整
if (top < 100) top = 100;                           // 最小顶部距离
if (top > windowHeight - buttonSize - 100) top = ...;  // 最大顶部距离
if (right < 15) right = 15;                         // 最小右侧距离

页面类型配置

在ai-chat.vue中自定义不同页面的欢迎语和快捷问题:

const titles = {
    index: 'AI智能助手',
    me: '个人助手',
    data: '数据分析助手',
    general: 'AI助手'
};

const questions = {
    index: ['如何使用?', '有什么功能?'],
    me: ['个人设置', '账户信息'],
    data: ['数据分析', '报表生成'],
    general: ['需要帮助吗?']
};

生命周期管理

自动管理(推荐)

使用aiFloatMixin时,生命周期自动管理:

export default {
    mixins: [aiFloatMixin],
    // mounted: 自动订阅
    // beforeDestroy: 自动取消订阅
}

手动管理

直接使用aiFloatManager时:

export default {
    data() {
        return {
            unsubscribePosition: null
        }
    },

    mounted() {
        // 手动订阅
        this.unsubscribePosition = this.$aiFloatManager.subscribe((pos) => {
            // 处理位置变化
        });
    },

    beforeDestroy() {
        // 手动取消订阅
        if (this.unsubscribePosition) {
            this.unsubscribePosition();
        }
    }
}

样式自定义

浮动按钮样式

.ai-float-btn {
    width: 60px;                    // 按钮大小
    height: 60px;
    border-radius: 50%;             // 圆形按钮
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);  // 渐变背景
    box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);               // 阴影效果
}

聊天窗口样式

.chat-container {
    width: 90vw;                    // 窗口宽度
    max-width: 400px;               // 最大宽度
    height: 70vh;                   // 窗口高度
    border-radius: 24px;            // 圆角
    background: #fff;               // 背景色
}

深色模式

@media (prefers-color-scheme: dark) {
    .chat-container {
        background: #1a1a1a;       // 深色背景
    }

    .message-bubble {
        background: #333;           // 深色消息气泡
        color: #fff;               // 白色文字
    }
}

常见问题

Q: 按钮位置不同步?

A: 确保在页面的onShow中调用:

onShow() {
    this.$aiFloatManager.setActivePageType('yourPageType');
}

Q: 聊天窗口不自动关闭?

A: 检查页面类型设置是否正确,确保每个页面都有唯一的pageType。

Q: 位置超出屏幕?

A: 组件内置边界检测,如需调整边界,修改validatePosition方法。

Q: 如何禁用某个页面的AI按钮?

A: 不在该页面中引入<ai-chat>组件即可。

Q: 如何自定义AI回复?

A: 修改ZH-AiChatButton.vue中的callAIChat方法,接入你的AI服务。

更新日志

v1.0.0

  • ✅ 基础浮动按钮功能
  • ✅ 位置拖拽和同步
  • ✅ 聊天窗口UI
  • ✅ 跨页面状态管理
  • ✅ 位置持久化存储
  • ✅ 深色模式支持

打赏

各位朋友觉得有用,还望不吝打赏,如需要对应的后台api代码的,打赏联系我。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议