diff --git a/.gitignore b/.gitignore index 0a684e6a..57f377d3 100644 --- a/.gitignore +++ b/.gitignore @@ -158,4 +158,5 @@ my_wakeup_words.mp3 main/manager-api/.vscode # Ignore webpack cache directory -main/manager-web/.webpack_cache/ \ No newline at end of file +main/manager-web/.webpack_cache/ +main/xiaozhi-server/mysql diff --git a/README.md b/README.md index 6feb1fc7..e8958e61 100644 --- a/README.md +++ b/README.md @@ -145,42 +145,24 @@ server: --- -## 部署方式 🚀 +## 部署文档 -[![Banners](docs/images/banner2.png)](./docs/Deployment.md) +本项目提供两种部署方式,请根据您的具体需求选择: -### 部署文档 +#### 🚀 部署方式选择 -本项目支持`最简化`安装和`全模块`安装。请根据具体需求选择安装方式。 +| 部署方式 | 特点 | 适用场景 | Docker部署文档 | 源码部署文档 | +|---------|------|---------|---------|---------| +| **最简化安装** | 智能对话、IOT功能,数据存储在配置文件 | 低配置环境,无需数据库 | [Docker只运行Server](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E5%8F%AA%E8%BF%90%E8%A1%8Cserver) | [本地源码只运行Server](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E5%8F%AA%E8%BF%90%E8%A1%8Cserver)| +| **全模块安装** | 智能对话、IOT、OTA、智控台,数据存储在数据库 | 完整功能体验 |[Docker运行全模块](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) | [本地源码运行全模块](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) | -`最简化`适合在较低资源配置中运行,无需数据库。[请参考-最简化安装架构图](./docs/images/deploy1.png) - -`全模块`适合想体验完整功能,过程复杂。[请参考-全模块安装架构图](./docs/images/deploy2.png) - -#### 1、 最简化安装 - -`最简化`安装包含:智能对话、IOT等功能,数据存储在`配置文件`。我们提供了两种安装教程,如果你决定使用最简化安装,可选择`Docker只运行Server`或`本地源码只运行Server`任意一种方式。 - -##### 1.1. Docker只运行Server - -你可以使用编译好的docker镜像安装,[点击Docker只运行Server](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E5%8F%AA%E8%BF%90%E8%A1%8Cserver)。优点:减少环境配置的烦恼;缺点:版本可能有点旧,镜像文件较大。 - -##### 2.2. 本地源码只运行Server - -你可以以本地源码的方式运行,[点击本地源码只运行Server](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E5%8F%AA%E8%BF%90%E8%A1%8Cserver)。优点:可以随时更新最新代码;缺点:安装Conda环境较为复杂。 - -#### 2、 全模块安装 - -`全模块`安装包含:智能对话、IOT、OTA、智控台,数据存储在`数据库`中。我们提供了两种安装教程,如果你决定使用全模块安装,可选择`Docker运行全模块`或`本地源码运行全模块`任意一种方式。 - -##### 2.1. Docker运行全模块 - -你可以使用编译好的docker镜像安装,[点击Docker运行全模块](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97)。优点:减少环境配置的烦恼;缺点:版本可能有点旧,镜像文件较大。 - -##### 2.2. 本地源码运行全模块 - -你可以以本地源码的方式运行,[点击本地源码运行全模块](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97)。优点:可以随时更新最新代码;缺点:安装Java、Node.js、Conda环境较为复杂。 +> 💡 提示:以下是按最新代码部署后的测试平台,有需要可烧录测试,并发为6个,每天会清空数据 +``` +智控台地址: https://2662r3426b.vicp.fun +OTA接口地址: htts://2662r3426b.vicp.fun/xiaozhi/ota/ +Websocket接口地址: wss://2662r3426b.vicp.fun/xiaozhi/v1/ +``` --- ## 常见问题 ❓ @@ -188,54 +170,41 @@ server: 如遇到问题或产品建议反馈[点这里](docs/FAQ.md)。 --- - -## 产品生态 👬 -小智是一个生态,当你使用这个产品时,也可以看看其他在这个生态圈的优秀项目 - -- [小智安卓客户端](https://github.com/TOM88812/xiaozhi-android-client) - - 一个基于xiaozhi-server的Android、IOS语音对话应用,支持实时语音交互和文字对话。现在是flutter版本,打通IOS、Android端。 -- [小智电脑客户端](https://github.com/Huang-junsen/py-xiaozhi) - - 该项目提供了一个基于 Python 实现的小白 AI 客户端,使得在不具备实体硬件条件的情况下,依然能够体过代码体验小智 AI 的功能。主要功能包括 AI 语音交互、视觉多模态识别、IoT 设备集成、联网音乐播放、语音唤醒、自动对话模式、图形化界面、命令行模式、跨平台支持、音量控制、会话管理、加密音频传输、自动验证码处理等。 -- [小智Java服务端](https://github.com/joey-zhou/xiaozhi-esp32-server-java) - - 小智开源后端服务 Java 版本是一个基于 Java 的开源项目,它包括前后端的服务,旨在为用户提供一个完整的后端服务解决方案。 ---- ## 功能清单 ✨ ### 已实现 ✅ -- **通信协议** - 基于 `xiaozhi-esp32` 协议,通过 WebSocket 实现数据交互。 -- **对话交互** - 支持唤醒对话、手动对话及实时打断。长时间无对话时自动休眠 -- **意图识别** - 支持使用LLM意图识别、function call函数调用,减少硬编码意图判断 -- **多语言识别** - 支持国语、粤语、英语、日语、韩语(默认使用 FunASR)。 -- **LLM 模块** - 支持灵活切换 LLM 模块,默认使用 ChatGLMLLM,也可选用阿里百炼、DeepSeek、Ollama 等接口。 -- **TTS 模块** - 支持 EdgeTTS(默认)、火山引擎豆包 TTS 等多种 TTS 接口,满足语音合成需求。 -- **记忆功能** - 支持超长记忆、本地总结记忆、无记忆三种模式,满足不同场景需求。 -- **IOT功能** - 支持管理注册设备IOT功能,支持基于对话上下文语境下的智能物联网控制。 -- **智控台** - 提供Web管理界面,支持智能体管理、用户管理、系统配置等功能,方便管理员和用户进行管理。 - +| 功能模块 | 描述 | +|---------|------| +| 通信协议 | 基于 `xiaozhi-esp32` 协议,通过 WebSocket 实现数据交互 | +| 对话交互 | 支持唤醒对话、手动对话及实时打断。长时间无对话时自动休眠 | +| 意图识别 | 支持使用LLM意图识别、function call函数调用,减少硬编码意图判断 | +| 多语言识别 | 支持国语、粤语、英语、日语、韩语(默认使用 FunASR) | +| LLM 模块 | 支持灵活切换 LLM 模块,默认使用 ChatGLMLLM,也可选用阿里百炼、DeepSeek、Ollama 等接口 | +| TTS 模块 | 支持 EdgeTTS(默认)、火山引擎豆包 TTS 等多种 TTS 接口,满足语音合成需求 | +| 记忆功能 | 支持超长记忆、本地总结记忆、无记忆三种模式,满足不同场景需求 | +| IOT功能 | 支持管理注册设备IOT功能,支持基于对话上下文语境下的智能物联网控制 | +| 智控台 | 提供Web管理界面,支持智能体管理、用户管理、系统配置等功能,方便管理员和用户进行管理 | ### 正在开发 🚧 -- 多种心情模式 - -想了解具体开发进度,[请点击这里](https://github.com/users/xinnan-tech/projects/3) +想了解具体开发计划进度,[请点击这里](https://github.com/users/xinnan-tech/projects/3) 如果你是一名软件开发者,这里有一份[《致开发者的公开信》](docs/contributor_open_letter.md),欢迎加入! --- +## 产品生态 👬 +小智是一个生态,当你使用这个产品时,也可以看看其他在这个生态圈的优秀项目 + +| 项目名称 | 项目地址 | 项目描述 | +|:---------------------|:--------|:--------| +| 小智安卓客户端 | [xiaozhi-android-client](https://github.com/TOM88812/xiaozhi-android-client) | 一个基于xiaozhi-server的Android、IOS语音对话应用,支持实时语音交互和文字对话。
现在是flutter版本,打通IOS、Android端。 | +| 小智电脑客户端 | [py-xiaozhi](https://github.com/Huang-junsen/py-xiaozhi) | 该项目提供了一个基于 Python 实现的小白 AI 客户端,使得在不具备实体硬件条件的情况下,
依然能够体过代码体验小智 AI 的功能。 | +| 小智Java服务端 | [xiaozhi-esp32-server-java](https://github.com/joey-zhou/xiaozhi-esp32-server-java) | 小智开源后端服务 Java 版本是一个基于 Java 的开源项目。
它包括前后端的服务,旨在为用户提供一个完整的后端服务解决方案。 | + +--- + ## 本项目支持的平台/组件列表 📋 ### LLM 语言模型 @@ -298,10 +267,17 @@ server: ## 鸣谢 🙏 -- 本项目受 [百聆语音对话机器人](https://github.com/wwbin2017/bailing) 启发,并在其基础上实现。 -- 感谢 [十方融海](https://www.tenclass.com/) 对小智通讯协议提供的详尽文档支持。 +| Logo | 项目/公司 | 说明 | +|:---:|:---:|:---| +| | [百聆语音对话机器人](https://github.com/wwbin2017/bailing) | 本项目受[百聆语音对话机器人](https://github.com/wwbin2017/bailing)启发,并在其基础上实现 | +| | [十方融海](https://www.tenclass.com/) | 感谢[十方融海](https://www.tenclass.com/)为小智生态制定了标准的通讯协议、多设备兼容性方案及高并发场景实践示范;为本项目提供了全链路技术文档支持 | +| | [玄凤科技](https://github.com/Eric0308) | 感谢[玄凤科技](https://github.com/Eric0308)贡献函数调用框架、MCP通信协议及插件化调用机制的实现代码,通过标准化的指令调度体系与动态扩展能力,显著提升了前端设备(IoT)的交互效率和功能延展性 | +| | [汇远设计](http://ui.kwd988.net/) | 感谢[汇远设计](http://ui.kwd988.net/)为本项目提供专业视觉解决方案,用其服务超千家企业的设计实战经验,赋能本项目产品用户体验 | +| | [西安勤人信息科技](https://www.029app.com/) | 感谢[西安勤人信息科技](https://www.029app.com/)深化本项目视觉体系,确保整体设计风格在多场景应用中的一致性和扩展性 | + + diff --git a/docs/Deployment.md b/docs/Deployment.md index 0bbe629d..097aea59 100644 --- a/docs/Deployment.md +++ b/docs/Deployment.md @@ -137,7 +137,10 @@ docker logs -f xiaozhi-esp32-server ``` docker stop xiaozhi-esp32-server docker rm xiaozhi-esp32-server +docker stop xiaozhi-esp32-server-web +docker rm xiaozhi-esp32-server-web docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest +docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:web_latest ``` 5.3、重新按docker方式部署 @@ -221,7 +224,7 @@ python app.py ## 配置项目 如果你的`xiaozhi-server`目录没有`data`,你需要创建`data`目录。 -如果你的`data`下面没有`.config.yaml`文件,你可以把源码目录下的`config.yaml`文件复制一份,重命名为`.config.yaml` +如果你的`data`下面没有`.config.yaml`文件,你可以把`xiaozhi-server`目录下的`config.yaml`文件复制到`data`,并重命名为`.config.yaml` 修改`xiaozhi-server`下`data`目录下的`.config.yaml`文件,配置本项目必须的一个配置。 diff --git a/docs/Deployment_all.md b/docs/Deployment_all.md index e4ac4ff9..9223c7fc 100644 --- a/docs/Deployment_all.md +++ b/docs/Deployment_all.md @@ -44,6 +44,8 @@ xiaozhi-server 在页面的右侧找到名称为`RAW`按钮,在`RAW`按钮的旁边,找到下载的图标,点击下载按钮,下载`docker-compose_all.yml`文件。 把文件下载到你的 `xiaozhi-server`中。 +或者直接执行 `wget https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/docker-compose_all.yml` 下载。 + 下载完后,回到本教程继续往下。 ##### 1.3.2 下载 config_from_api.yaml @@ -53,6 +55,8 @@ xiaozhi-server 在页面的右侧找到名称为`RAW`按钮,在`RAW`按钮的旁边,找到下载的图标,点击下载按钮,下载`config_from_api.yaml`文件。 把文件下载到你的 `xiaozhi-server`下面的`data`文件夹中,然后把`config_from_api.yaml`文件重命名为`.config.yaml`。 +或者直接执行 `wget https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/config_from_api.yaml` 下载保存。 + 下载完配置文件后,我们确认一下整个`xiaozhi-server`里面的文件如下所示: ``` @@ -67,57 +71,37 @@ xiaozhi-server 如果你的文件目录结构也是上面的,就继续往下。如果不是,你就再仔细看看是不是漏操作了什么。 -## 2. 安装Mysql和Redis +## 2. 备份数据 -### 2.1 安装Mysql数据库 -如果本机已经安装了MySQL,可以直接在数据库中创建名为`xiaozhi_esp32_server`的数据库。 - -```sql -CREATE DATABASE xiaozhi_esp32_server CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -``` - -如果还没有MySQL,你可以通过docker安装mysql - -``` -docker run --name xiaozhi-esp32-server-db -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -e MYSQL_DATABASE=xiaozhi_esp32_server -e MYSQL_INITDB_ARGS="--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci" -d mysql:latest -``` - -### 2.2 安装Redis - -如果还没有Redis,你可以通过docker安装redis - -``` -docker run --name xiaozhi-esp32-server-redis -d -p 6379:6379 redis -``` - -## 3. 配置docker-compose_all.yml文件文件 - -在`xiaozhi-server`目录,打开docker-compose_all.yml, - -1、修改`SPRING_DATASOURCE_DRUID_URL`里,把`192.168.1.25`修改成部署mysql的电脑局域网ip,如果是你本地,你要查看一下你本机的局域网ip是什么 - -2、修改`SPRING_DATA_REDIS_HOST`里,把`192.168.1.25`修改成部署redis的电脑局域网ip,如果是你本地,你要查看一下你本机的局域网ip是什么 - -3、确认一下mysql的用户名`SPRING_DATASOURCE_DRUID_USERNAME`和密码`SPRING_DATASOURCE_DRUID_PASSWORD` - -## 4. 运行程序 - -确认mysql和redis是否运行正常,输入 -``` -docker ps -``` -如果你能看到`xiaozhi-esp32-server-redis`和`xiaozhi-esp32-server-db`信息,就可以继续往下,如果看不到,说明你的`mysql`和`redis`没有安装或没有启动。需要继续回到上面的教程,看看哪一步漏了。 - -``` -CONTAINER ID IMAGE COMMAND CREATED TATUS PORTS NAMES -xxx redis "xx" xxx xxx 0.0.0.0:6379->6379/tcp xiaozhi-esp32-server-redis -xxx mysql:latest "xx" xxx xxx 0.0.0.0:3306->3306/tcp, 33060/tcp xiaozhi-esp32-server-db -``` +如果你之前已经成功运行智控台,如果上面保存有你的密钥信息,请先从智控台上拷贝重要数据下来。因为升级过程中,有可能会覆盖原来的数据。 +## 3. 清除历史版本镜像和容器 接下来打开命令行工具,使用`终端`或`命令行`工具 进入到你的`xiaozhi-server`,执行以下命令 ``` -docker-compose -f docker-compose_all.yml up -d +docker compose -f docker-compose_all.yml down + +docker stop xiaozhi-esp32-server +docker rm xiaozhi-esp32-server + +docker stop xiaozhi-esp32-server-web +docker rm xiaozhi-esp32-server-web + +docker stop xiaozhi-esp32-server-db +docker rm xiaozhi-esp32-server-db + +docker stop xiaozhi-esp32-server-redis +docker rm xiaozhi-esp32-server-redis + +docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest +docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:web_latest +``` + +## 4. 运行程序 +执行以下命令启动新版本容器 + +``` +docker compose -f docker-compose_all.yml up -d ``` 执行完后,再执行以下命令,查看日志信息。 @@ -150,17 +134,16 @@ http://localhost:8002/xiaozhi/doc.html ``` manager-api: - url: http://127.0.0.1:8002/xiaozhi + url: http://127.0.0.1:8002/xiaozhi secret: 你的server.secret值 ``` 1、把你刚才从`智控台`复制过来的`server.secret`的`参数值`复制到`.config.yaml`文件里的`secret`里。 - -2、把`url`里的`127.0.0.1`改成你电脑局域网内的ip +2、注意,把`url`改成下面的`http://xiaozhi-esp32-server-web/xiaozhi` 类似这样的效果 ``` manager-api: - url: http://192.168.1.25:8002/xiaozhi + url: http://xiaozhi-esp32-server-web/xiaozhi secret: 12345678-xxxx-xxxx-xxxx-123456789000 ``` @@ -202,24 +185,6 @@ ws://你电脑局域网的ip:8000/xiaozhi/v1/ 接下来,你就可以开始 [编译esp32固件](firmware-build.md)了。 -## 6. 版本升级操作 - -如果后期想升级版本,先备份你的模型密钥。 - -进入`xiaozhi-server`目录 - -5.1、执行以下命令 - -``` -docker-compose down -docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest -docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:web_latest -``` - -5.2、删掉`docker-compose_all.yaml`文件 - -5.3、重新按1.1开始部署 - # 方式二:本地源码运行全模块 ## 1.安装MySQL数据库 @@ -388,6 +353,9 @@ pip install -r requirements.txt `server.secret`需要说明一下,这个`参数值`很重要,作用是让我们的`Server`端连接`manager-api`。`server.secret`是每次从零部署manager模块时,会自动随机生成的密钥。 +如果你的`xiaozhi-server`目录没有`data`,你需要创建`data`目录。 +如果你的`data`下面没有`.config.yaml`文件,你可以把`xiaozhi-server`目录下的`config_from_api.yaml`文件复制到`data`,并重命名为`.config.yaml` + 复制`参数值`后,打开`xiaozhi-server`下的`data`目录的`.config.yaml`文件。此刻你的配置文件内容应该是这样的: ``` diff --git a/docs/images/logo_bailing.png b/docs/images/logo_bailing.png new file mode 100644 index 00000000..22ab6e11 Binary files /dev/null and b/docs/images/logo_bailing.png differ diff --git a/docs/images/logo_huiyuan.png b/docs/images/logo_huiyuan.png new file mode 100644 index 00000000..6e441913 Binary files /dev/null and b/docs/images/logo_huiyuan.png differ diff --git a/docs/images/logo_qinren.png b/docs/images/logo_qinren.png new file mode 100644 index 00000000..a01af841 Binary files /dev/null and b/docs/images/logo_qinren.png differ diff --git a/docs/images/logo_tenclass.png b/docs/images/logo_tenclass.png new file mode 100644 index 00000000..86a6dc4a Binary files /dev/null and b/docs/images/logo_tenclass.png differ diff --git a/docs/images/logo_xuanfeng.png b/docs/images/logo_xuanfeng.png new file mode 100644 index 00000000..552ee78a Binary files /dev/null and b/docs/images/logo_xuanfeng.png differ diff --git a/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java index 78a7b511..7be38a89 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java @@ -171,7 +171,13 @@ public class ConfigServiceImpl implements ConfigService { switch (param.getValueType().toLowerCase()) { case "number": try { - current.put(lastKey, Double.parseDouble(value)); + double doubleValue = Double.parseDouble(value); + // 如果数值是整数形式,则转换为Integer + if (doubleValue == (int) doubleValue) { + current.put(lastKey, (int) doubleValue); + } else { + current.put(lastKey, doubleValue); + } } catch (NumberFormatException e) { current.put(lastKey, value); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java b/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java index 7bd356fc..fdcb62b2 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java @@ -76,6 +76,7 @@ public class ShiroConfig { filterMap.put("/favicon.ico", "anon"); filterMap.put("/user/captcha", "anon"); filterMap.put("/user/login", "anon"); + filterMap.put("/user/pub-config", "anon"); filterMap.put("/user/register", "anon"); filterMap.put("/config/server-base", "anon"); filterMap.put("/config/agent-models", "anon"); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java b/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java index 7db612b5..0ee6a1ce 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java @@ -1,6 +1,8 @@ package xiaozhi.modules.security.controller; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -111,4 +113,12 @@ public class LoginController { sysUserTokenService.changePassword(userId, passwordDTO); return new Result<>(); } + + @GetMapping("/pub-config") + @Operation(summary = "公共配置") + public Result> pubConfig() { + Map config = new HashMap<>(); + config.put("version", "0.3.3"); + return new Result>().ok(config); + } } \ No newline at end of file diff --git a/main/manager-web/.env.development b/main/manager-web/.env.development index ced1a9e7..0a1de306 100644 --- a/main/manager-web/.env.development +++ b/main/manager-web/.env.development @@ -1,4 +1 @@ -# 暂时使用群主的接口 -# VUE_APP_API_BASE_URL=https://2662r3426b.vicp.fun/xiaozhi -# 如果本地开发,请使用以下接口 -VUE_APP_API_BASE_URL=http://localhost:8002/xiaozhi \ No newline at end of file +VUE_APP_API_BASE_URL=/xiaozhi \ No newline at end of file diff --git a/main/manager-web/src/apis/module/user.js b/main/manager-web/src/apis/module/user.js index 748867b2..84d5b7f9 100755 --- a/main/manager-web/src/apis/module/user.js +++ b/main/manager-web/src/apis/module/user.js @@ -106,7 +106,7 @@ export default { }, // 修改用户状态 changeUserStatus(status, userIds, successCallback) { - console.log(555,userIds) + console.log(555, userIds) RequestService.sendRequest() .url(`${getServiceUrl()}/admin/users/changeStatus/${status}`) .method('put') @@ -122,4 +122,20 @@ export default { }) }).send() }, + // 获取公共配置 + getPubConfig(callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/user/pub-config`) + .method('GET') + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .fail((err) => { + console.error('获取公共配置失败:', err); + RequestService.reAjaxFun(() => { + this.getPubConfig(callback); + }); + }).send(); + }, } diff --git a/main/manager-web/src/components/VersionFooter.vue b/main/manager-web/src/components/VersionFooter.vue new file mode 100644 index 00000000..8a8b76a0 --- /dev/null +++ b/main/manager-web/src/components/VersionFooter.vue @@ -0,0 +1,39 @@ + + + + + \ No newline at end of file diff --git a/main/manager-web/src/views/DeviceManagement.vue b/main/manager-web/src/views/DeviceManagement.vue index 9e362edb..1dd2844c 100644 --- a/main/manager-web/src/views/DeviceManagement.vue +++ b/main/manager-web/src/views/DeviceManagement.vue @@ -88,6 +88,7 @@ + @@ -131,6 +132,7 @@ export default { }, pageCount() { return Math.ceil(this.filteredDeviceList.length / this.pageSize); + }, visiblePages() { const pages = []; @@ -523,4 +525,5 @@ export default { color: #5a64b5; } + diff --git a/main/manager-web/src/views/ModelConfig.vue b/main/manager-web/src/views/ModelConfig.vue index 002a3e5a..2f5a5dae 100644 --- a/main/manager-web/src/views/ModelConfig.vue +++ b/main/manager-web/src/views/ModelConfig.vue @@ -3,21 +3,15 @@
-

{{ modelTypeText }}

+

{{ modelTypeText }}

-
- - - 搜索 - -
+
+ + + 搜索 + +
@@ -93,9 +87,9 @@ @@ -639,7 +629,6 @@ export default { gap: 8px; } - .title-wrapper { display: flex; align-items: center; diff --git a/main/manager-web/src/views/UserManagement.vue b/main/manager-web/src/views/UserManagement.vue index 79593591..d43af456 100644 --- a/main/manager-web/src/views/UserManagement.vue +++ b/main/manager-web/src/views/UserManagement.vue @@ -42,7 +42,7 @@
- {{ isAllSelected ? '取消全选' : '全选' }} + {{ isAllSelected ? '取消全选' : '全选' }} 启用
-
diff --git a/main/manager-web/src/views/home.vue b/main/manager-web/src/views/home.vue index c33d2049..b09d032e 100644 --- a/main/manager-web/src/views/home.vue +++ b/main/manager-web/src/views/home.vue @@ -35,11 +35,11 @@ @deviceManage="handleDeviceManage" @delete="handleDeleteAgent" /> - + + + @@ -49,10 +49,11 @@ import Api from '@/apis/api'; import AddWisdomBodyDialog from '@/components/AddWisdomBodyDialog.vue'; import DeviceItem from '@/components/DeviceItem.vue'; import HeaderBar from '@/components/HeaderBar.vue'; +import VersionFooter from '@/components/VersionFooter.vue'; export default { name: 'HomePage', - components: { DeviceItem, AddWisdomBodyDialog, HeaderBar }, + components: { DeviceItem, AddWisdomBodyDialog, HeaderBar, VersionFooter }, data() { return { addDeviceDialogVisible: false, diff --git a/main/manager-web/src/views/login.vue b/main/manager-web/src/views/login.vue index 23c8479e..af50bc1c 100644 --- a/main/manager-web/src/views/login.vue +++ b/main/manager-web/src/views/login.vue @@ -51,9 +51,7 @@ - + @@ -61,11 +59,14 @@