项目介绍

本项目旨在打造一个基于通义千问模型的智能助手,能够理解用户指令并自动生成可执行的 JavaScript 代码。该代码可直接调用预设接口,完成指定操作,并返回执行结果。通过大模型的理解与生成能力,实现从自然语言到接口调用的自动化流程,提升开发效率与交互体验。

功能特点

  • 自然语言理解:能够准确理解用户的指令和意图
  • 代码生成:自动生成符合要求的JavaScript代码
  • 接口调用:支持与预设接口的无缝对接
  • 实时反馈:提供执行结果的即时反馈

技术架构

后端服务

  • 基于Node.js构建的图书管理系统服务
  • RESTful API接口设计
  • 支持图书的增删改查等基础操作

前端界面

  • 基于现代Web技术栈开发
  • 提供直观的用户交互界面

API接口

系统提供以下主要接口:

  • 获取图书列表
  • 获取图书详情
  • 添加新图书
  • 更新图书信息
  • 删除图书

项目结构

├── book-system-server/     # 图书管理系统服务端
│   ├── src/                # 源代码目录
│   │   ├── app.js         # 应用入口
│   │   ├── config/        # 配置文件
│   │   ├── controllers/   # 控制器
│   │   ├── routes/        # 路由定义
│   │   └── utils/         # 工具函数
│   └── package.json       # 项目依赖
└── code/                  # 智能助手核心代码├── src/               # 源代码目录│   ├── app.js         # 应用入口│   ├── config/        # 配置文件│   ├── utils/         # 工具函数│   └── webui/         # Web界面└── package.json       # 项目依赖

开发环境

  • Node.js环境
  • 开发IDE:IntelliJ IDEA
  • 服务地址:http://localhost:5000
  • 前台页面:http://localhost:3000

使用说明

  1. 确保已安装Node.js环境
  2. 克隆项目到本地
  3. 分别在book-system-server和code目录下运行:
npm install
  1. 启动服务

  2. 启动服务前需要配置apiKey

源码下载

智能助手

演示截图

系统首页
在这里插入图片描述

查看接口文档
在这里插入图片描述

核心源码

code/src/app.js

const { exec } = require('child_process');
const express = require('express');
const fs = require('fs');
const path = require('path');
const logger = require('./utils/logger');
const config = require('./config/config');
const { callGpt } = require('./utils');const app = express();app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, './webui')));app.get('/api/docs', (req, res) => {const docPath = path.join(__dirname, 'config', '接口文档.md');fs.readFile(docPath, 'utf-8', (err, data) => {if (err) {logger.error('读取接口文档失败:', err);return res.status(500).json({ error: '无法读取接口文档' });}res.type('text/markdown').send(data);});
});app.post('/api/ask', async (req, res) => {const { text, history } = req.body;if (!text || typeof text !== 'string') {return res.status(400).json({ error: '缺少或无效的 text 参数' });}const apiKey = config.apiKey;if (!apiKey) {return res.status(500).json({ error: '未配置有效的 API Key' });}logger.info('开始调用 GPT 接口,请求体:', { text });try {const gptResponse = await callGpt(apiKey, text, history);logger.info('GPT 接口调用成功,响应内容:', gptResponse);res.json({status: 'success',answer: gptResponse});} catch (error) {logger.error('调用 GPT 接口出错:', error.message);res.status(500).json({status: 'error',message: '调用 GPT 失败'});}
});app.post('/api/run-code', (req, res) => {const code = req.body.code;if (!code) {return res.status(400).json({ status: 'error', message: '缺少代码内容' });}// 创建临时文件路径const tempFilePath = path.join(__dirname, 'tempScript.js');// 写入代码到文件fs.writeFileSync(tempFilePath, code);// 使用 node 执行脚本exec(`node ${tempFilePath}`, (error, stdout, stderr) => {fs.unlinkSync(tempFilePath); // 删除临时文件if (error) {return res.json({status: 'error',message: stderr || error.message});}res.json({status: 'success',output: stdout});});
});// 启动服务器
app.listen(config.server.port, config.server.host, () => {logger.info(`转发服务器启动在 http://${config.server.host}:${config.server.port}`);
});module.exports = app;

code/src/utils/index.js

const path = require("path");
const fs = require("fs/promises");async function callGpt(apiKey, questionText, history) {const docPath = path.join(__dirname, '../config', '接口文档.md');const context = await fs.readFile(docPath, 'utf-8');const response = await fetch("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions", {method: "post",headers: {"Content-Type": "application/json","Authorization": `Bearer ${apiKey}`},body: JSON.stringify({model: "qwen-plus",messages: [{role: "assistant",content: "这是我的接口文档,你可以将该文档作为上下文,从中获取信息,文档信息如下:" + context,},{role: "assistant",content: "我会向你进行一些提问,最终都是为了一些操作服务,例如查询什么信息,添加什么信息,修改什么信息等;如我未提供一些必要信息时,你需要向我进行一些提问,让我补充信息;" +"记住如果是查询类的,你可以进行一些默认设定,例如查常用的,或者给定一些默认情况等;但如果是涉及到变更操作的,如新增、修改、删除等,你都需要先向我询问并获取一些必要信息。",},{role: "assistant",content: "需要注意,你是一个助手,用户是日常生活中的普通人,并不是计算机领域的人员,所以你输出的一些内容需要不包含什么专业词汇,而且需要更多的引导,这方面需要重点注意;" +"同时在缺少部分条件时,你可以预设一些条件,然后后续说明即可,用户可以再更改。",},{role: "assistant",content: "当不需要额外信息或信息补充完成时你需要借助上述接口文档来实现前述的操作,通过 nodejs 和 axios 来调用接口,将相关代码输出给我,需要是完整的代码,代码放在一个文件中即可,要求返回的内容中只有一段JavaScript代码,方便我提取;" +"需要注意的是,并不是每次回答你都需要返回要执行的代码,只有在你觉得信息已经获取够了就可以采用代码进行操作了;然后需要注意的是代码里面不要出现 console 的日志输出,因为我在执行代码时会将输出的日志也记录到返回中,这些日志会影响我的返回结果。",},...history,{role: "assistant",content: questionText,}]}),});if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}return response.json();
}module.exports = {callGpt,
}

code/src/webui/index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>智能助手</title><link rel="icon" href="favicon.ico" type="image/x-icon"><link rel="stylesheet" href="css/style.css">
</head>
<body><div class="container"><div class="terminal" id="terminalContainer"><div class="terminal-header"><div class="terminal-title">智能助手</div><div class="terminal-controls"><button id="configBtn" class="config-btn">查看接口文档</button><span class="control minimize"></span><span class="control maximize"></span><span class="control close"></span></div></div><div class="terminal-body"><div id="output"></div><div class="command-line"><span class="prompt">$</span><input type="text" id="commandInput" autofocus></div></div></div></div><!-- 查看接口文档弹窗 --><div id="configModal" class="modal"><div class="modal-content"><div class="modal-header"><h2>查看接口文档</h2><span class="close-modal">&times;</span></div><div class="modal-body"></div></div></div><script src="js/marked.min.js"></script><script src="js/settings.js"></script><script src="js/terminal.js"></script>
</body>
</html>

code/src/webui/js/terminal.js

class Terminal {constructor() {this.output = document.getElementById('output');this.terminalBody = document.getElementsByClassName('terminal-body')[0];this.commandLine = document.getElementsByClassName('command-line')[0];this.input = document.getElementById('commandInput');this.commandHistory = [];this.historyIndex = -1;this.history = [];this.commands = {help: this.showHelp.bind(this),clear: this.clear.bind(this),};this.setupEventListeners();this.printWelcome();this.setupFocusHandlers();this.focusInput();}setupEventListeners() {this.input.addEventListener('keydown', (e) => {if (e.key === 'Enter') {this.executeCommand().then(_ => {});} else if (e.key === 'ArrowUp') {e.preventDefault();this.navigateHistory('up');} else if (e.key === 'ArrowDown') {e.preventDefault();this.navigateHistory('down');}});}async executeCommand() {const command = this.input.value.trim();if (!command) return;this.commandHistory.push(command);this.historyIndex = this.commandHistory.length;this.println('');this.appendText("<span>$</span>");this.println(` ${command}`);this.input.value = '';const [cmd, ...args] = command.split(' ');if (cmd === "help" || cmd === "clear") {const handler = this.commands[cmd];try {if (handler) {await handler(args);} else {this.println(`命令未找到: ${cmd}`);}} catch (error) {this.println(`错误: ${error.message}`);}} else {this.input.blur();this.commandLine.style.display = "none";let dots = 0;this.erase();this.println('.'.repeat(dots));const interval = setInterval(() => {dots = (dots + 1) % 4;this.erase();this.println('.'.repeat(dots));}, 500);try {const response = await fetch('/api/ask', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ text: command, history: this.history })});const result = await response.json();clearInterval(interval);this.erase();this.output.innerHTML = this.output.innerHTML.replace("<span>$</span>", "$");if (result.status === "success") {const text = result.answer['choices'][0].message.content;await this.handleText(text);// 将本次交互加入 historythis.history.push({ role: 'assistant', content: command },{ role: 'system', content: text });}this.commandLine.style.display = "block";this.input.focus();} catch (error) {this.println(`错误: ${error.message}`);}}}async handleText(text) {if (text.includes("```javascript") || text.includes("```js")) {const codeRegex = /```(?:javascript|js)\n([\s\S]*?)```/;const match = text.match(codeRegex);if (match && match[1]) {const code = match[1];this.println('');this.println('正在执行代码...');try {const res = await fetch('/api/run-code', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ code })});const data = await res.json();if (data.status === 'success') {this.println('\n✅ 执行结果:');this.println('');this.println(data.output || '(无输出)');} else {this.println('\n❌ 执行错误:');this.println(data.message);}} catch (err) {this.println('\n❌ 网络错误:');this.println(err.message);}}} else {this.println('');this.println(text);}}navigateHistory(direction) {if (direction === 'up' && this.historyIndex > 0) {this.historyIndex--;} else if (direction === 'down' && this.historyIndex < this.commandHistory.length) {this.historyIndex++;}this.input.value = this.commandHistory[this.historyIndex] || '';}println(text) {const escapedText = text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;');this.output.innerHTML += escapedText + '\n';this.terminalBody.scrollTop = this.terminalBody.scrollHeight;}appendText(text) {this.output.innerHTML += text;this.terminalBody.scrollTop = this.terminalBody.scrollHeight;}erase() {const innerHTML = this.output.innerHTML;const lastIndexOf = innerHTML.lastIndexOf("<span>$</span>");const indexOf = innerHTML.indexOf("\n", lastIndexOf);if (indexOf !== -1) {this.output.innerHTML = innerHTML.substring(0, indexOf + 1);}this.terminalBody.scrollTop = this.terminalBody.scrollHeight;}clear() {this.output.innerHTML = '';}printWelcome() {this.println('欢迎使用智能助手');this.println('输入 help 查看当前智能助手的功能');this.println('');}showHelp() {this.println(`
可用命令:help           查看当前智能助手的功能clear          清空终端[text]         通过自然语言调用功能`);}setupFocusHandlers() {const terminalContainer = document.getElementById('terminalContainer');terminalContainer.addEventListener('click', () => {this.focusInput();});this.input.addEventListener('click', (e) => {e.stopPropagation();});window.addEventListener('focus', () => {this.focusInput();});document.addEventListener('visibilitychange', () => {if (!document.hidden) {this.focusInput();}});}focusInput() {if (this.input && !('ontouchstart' in window)) {this.input.focus();}}
}const terminal = new Terminal();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86610.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86610.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86610.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【源码+文档+调试讲解】基于web的运动健康小程序的设计与实现y196

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…

临床项目计划框架

一、项目概述 1.1 项目名称 项目名称:评估XX药物在YY患者中安全性和有效性的III期随机对照试验 1.2 项目背景与立项依据 1.2.1 研究背景 简述疾病负担、当前治疗现状、未满足的医疗需求,为项目开展提供背景支持。 1.2.2 科学依据 总结前期研究结果、理论基础、研究假设的形…

Hoare逻辑与分离逻辑:从程序验证到内存推理的演进

文章目录 引言一、Hoare逻辑基础&#xff1a;程序正确性的形式化验证&#x1f330; 例子&#xff1a;简单赋值语句的Hoare逻辑验证&#x1f330; 例子&#xff1a;条件语句的Hoare逻辑验证 二、分离逻辑&#xff1a;Hoare逻辑在内存管理中的扩展&#x1f50d; 分离逻辑的核心扩…

Tomcat Maven 插件

在 Maven 项目中&#xff0c;可以使用 Tomcat Maven 插件&#xff08;tomcat7-maven-plugin 或 tomcat-maven-plugin&#xff09;来直接部署 WAR 文件到 Tomcat 服务器&#xff0c;而无需手动复制 WAR 文件到 webapps 目录。以下是详细的使用方法&#xff1a; 1. 配置 Tomcat M…

【开源工具】一键解决使用代理后无法访问浏览器网页问题 - 基于PyQt5的智能代理开关工具开发全攻略

&#x1f310;【开源工具】一键解决使用代理后无法访问浏览器网页问题 - 基于PyQt5的智能代理开关工具开发全攻略 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代…

异步IO框架io_uring实现TCP服务器

一、io_uring介绍 io_uring是 Linux 于 2019 年加入到内核的一种新型异步 I/O 模型&#xff0c;io_uring 主要为了解决 原生AIO&#xff08;Native AIO&#xff09; 存在的一些不足之处。下面介绍一下原生 AIO 的不足之处&#xff1a; 系统调用开销大&#xff1a;提交 I/O 操作…

【docker】docker run参数说明

功能 拉起容器。 参数 -i&#xff0c;--interactive 保持容器标准输入放开&#xff0c;就算没有终端也放开。 可以理解为可以向容器内输入东西&#xff0c;比如&#xff1a; [rootlocalhost ~]# echo 111 | docker run -i yaxin:1.0 cat 111--cap-add 用于向容器添加特定的…

从0开始学习计算机视觉--Day04--损失函数

在上次学习中&#xff0c;我们知道了线性分类的函数是f(x,W),但并没有解释要怎么得到W权重矩阵的值&#xff0c;以及我们要怎么用训练数据来确定它的最优权重矩阵。在之前我们知道&#xff0c;假设用了10种类别的图片用于训练&#xff0c;将其中一种图片输入模型后&#xff0c;…

【V2.0】TPS-61088升压板-3.7V升压到9V电源板

优化一下上一版本的升压板&#xff1a; TPS-61088升压板-3.7V升压到9V电源板-CSDN博客 改动参考了官方的demo板 加了很多的电容&#xff0c;封装很大&#xff0c;同时去掉了AGND&#xff0c;直接使用一个GND。 补偿电路增加了一个47pF的电容。 EN引脚改用输入的电压分压来启…

基于DeepSeek搭建Dify智能助手国产化架构运行arm64

基于DeepSeek搭建Dify智能助手国产化架构运行arm64 基于DeepSeek搭建Dify智能助手案例介绍案例内容1 概述1.1 背景介绍1.2 适用对象1.3 案例时间1.4 案例流程1.5 资源总览 2.启动 Docker 容器没有的安装2.1没有Docker安装 3 云主机部署DeepSeek3.1 安装Ollama 4.安装Dify4.1Doc…

PyQtNode Editor 第一篇环境配置

PyQtNode Editor 以其独特的功能和灵活的扩展性&#xff0c;吸引了众多开发者的目光。 这篇博客作为系列开篇&#xff0c;将详细介绍开发 PyQtNode Editor 所需的基础环境、安装步骤&#xff0c;同时深入解读一段简单的 PyQt5 代码&#xff0c;为后续的开发工作奠定基础。 一…

Unity 脚本自动添加头部注释

&#x1f4dd; Unity Script Header 注释生成器 一个轻量、可配置的 Unity 编辑器工具&#xff0c;在创建 .cs 脚本时自动插入统一格式的注释头信息。 支持作者、邮箱、公司、地点、版权、描述等字段&#xff0c;所有信息都可通过 Project Settings 界面配置并动态开关。 &…

偏微分方程能量变化分析2

题目 问题 9. 考虑以下带有边界条件的偏微分方程&#xff08;PDE&#xff09;&#xff1a; u t t − c 2 u x x 0 , x > 0 , u_{tt} - c^2 u_{xx} 0, \quad x > 0, utt​−c2uxx​0,x>0, u ∣ x 0 0. u|_{x0} 0. u∣x0​0. 定义能量泛函&#xff1a; E ( t ) …

模型部署和推理架构学习笔记

一. 初步认识模型部署 1. 什么是ONNX&#xff1f; ONNX 就是一个 中间人 或 通用翻译器。它让你在喜欢的框架&#xff08;如 PyTorch&#xff09;里训练好模型后&#xff0c;能轻松地把它变成一种 标准格式。然后&#xff0c;这个标准格式的模型可以被 很多不同的工具和硬件 …

OpenCV CUDA模块设备层-----逐通道的正弦运算函数sin()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV 的 CUDA 模块&#xff08;cv::cudev&#xff09; 中的一个设备端数学函数&#xff0c;用于在 CUDA 核函数中对 uchar4 类型&#xff08;即…

人工智能-基础篇-2-什么是机器学习?(ML,监督学习,半监督学习,零监督学习,强化学习,深度学习,机器学习步骤等)

1、什么是机器学习&#xff1f; 机器学习&#xff08;Machine Learning, ML&#xff09;是人工智能的一个分支&#xff0c;是一门多领域交叉学科&#xff0c;涉及概率论、统计学、逼近论、凸分析等数学理论。其核心目标是让计算机通过分析数据&#xff0c;自动学习规律并构建模…

【deepseek】TCP/IP ISO 卸载

TCP/IP 全卸载中的 LSO&#xff08;Large Send Offload&#xff09; 和 LRO&#xff08;Large Receive Offload&#xff09; 是网卡硬件加速技术&#xff0c;其核心目标是 将 TCP/IP 协议栈的处理任务从 CPU 转移到网卡硬件&#xff0c;从而大幅降低 CPU 负载并提升网络性能。以…

抖音小程序支付错误码141211

前情 uni-app是我比较喜欢的跨平台框架&#xff0c;它能开发小程序/H5/APP(安卓/iOS)&#xff0c;重要的是对前端开发友好&#xff0c;自带的IDE让开发体验也挺棒的&#xff0c;公司项目就是主推uni-app 公司今年准备新开一个项目&#xff0c;但是对项目的未来和项目要做的规…

springcloud/springmvc协调作用传递验证信息

微服务架构的拆分&#xff0c;各模块之间使用feign组件来进行相互http转发通信。 前端与后端之间使用springcloud的网关来进行协调。 现在问题出现&#xff0c;用户的信息如何进行传递&#xff1f; 前端请求携带请求头&#xff0c;请求头中的authorization为携带的对应token…

Apache Flink Kafka 写连接器源码深度剖析

一、架构概述 Apache Flink 提供的 Kafka 写入连接器是实现与 Kafka 消息队列集成的关键组件&#xff0c;支持多种语义保证和灵活配置选项。本文将深入分析 Flink Kafka 写入连接器的源码实现&#xff0c;包括架构设计、核心类、事务机制和性能优化等方面。 1.1 整体架构 Fl…