【05】从0到1构建AI生成思维导图应用 -- 前端交互实现

【05】从0到1构建AI生成思维导图应用 – 前端交互实现

大家好!最近自己做了一个完全免费的AI生成思维导图的网站,支持下载,编辑和对接微信公众号,可以在这里体验:https://lt2mind.zeabur.app/
上一章:https://blog.csdn.net/m0_56699208/article/details/140061215?spm=1001.2014.3001.5502

上一章中,我们已经构建了完整的 生成思维导图的 AI 功能,并将其暴露为 API。接下来,我们要编写一套交互逻辑,供用户输入文字或链接,点击按钮,即可生成思维导图,并提供下载和编辑按钮。

import axios from "axios";
export const toMind = async (query: string) => {const url = 'https://api.coze.cn/open_api/v2/chat';const headers = {'Content-Type': 'application/json','Authorization': "Bearer your api key"};const body = {"conversation_id": "1","bot_id": "your bot id","user": "29032201862555","query": query,"stream": false};try {const response = await axios.post(url, body, { headers });console.log('Response:', response.data.messages[2].content);const urlPattern = /https:\/\/[^\s]+/g;let urls = response.data.messages[2].content.match(urlPattern);let imgUrl = urls[0]let editUrl = urls[1]return {imgUrl, editUrl}} catch (error) {console.error('Error:', error);}};

这段代码使用正则表达式/https://[^\s]+/g来匹配响应内容中的URL,包含两个属性imgUrl和editUrl,分别对应匹配到的第一个和第二个URL。这两个URL分别是图片的下载地址和对应在treemind里面的编辑地址。我们只需要在前端把链接给到对应的按钮上,即可实现交互逻辑:
完整代码:

"use client";
import { useState } from "react";
import { SignedOut, useUser } from "@clerk/nextjs";
import { Textarea } from "./ui/textarea";
import Header from "./header";
import Feature from "../components/feature";
import Img from "next/image";
import { Button } from "@/components/ui/button";
import { toMind } from "@/lib/coze";
import Link from "next/link";
import { Typewriter } from "react-simple-typewriter";
import { Skeleton } from "@/components/ui/skeleton";
import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from "../components/ui/tooltip";export default function Hero() {const { isSignedIn } = useUser();const [imgUrl, setImgUrl] = useState("");const [editUrl, setEditUrl] = useState("");const [loading, setLoading] = useState(false);const handleSubmit = async (event: any) => {event.preventDefault(); // Prevent the default form submission behaviorif (!isSignedIn) {//router.push('/sign-in');return;}setLoading(true);const inputValue = event.target.elements.textOrLink.value; // Get the value from the textareaconst result = await toMind(inputValue); // Call the toMind function with the input valueif (result) {setImgUrl(result.imgUrl);setEditUrl(result.editUrl);}setLoading(false);};return (<div className="flex flex-col bg"><header className="text-blue-500"><Header /><section className="container max-w-5xl px-4 md:px-6 py-6 md:py-10"><div className="text-center space-y-4 sm:mt-4"><h1 className="text-4xl md:text-6xl font-bold tracking-widest">LT2MIND</h1><p className="text-lg md:text-xl max-w-3xl mx-auto italic"><Typewriterwords={["Transform your text and links into beautiful mind maps with ease.",]}loop={1}cursorcursorStyle=""typeSpeed={20}deleteSpeed={50}delaySpeed={1000}/></p></div></section><Feature /><section className="py-12 md:py-20"><div className="container max-w-5xl px-4 md:px-6 grid grid-cols-1 md:grid-cols-2 gap-8"><div className="space-y-4"><h2 className="text-3xl font-bold text-purple-400">Convert to Mind Map</h2><p className="text-muted-foreground">Enter your text or link and let LT2Mind do the rest. You maywait for one minute or more for the transition to complete.</p><form className="flex gap-2" onSubmit={handleSubmit}><div className="flex flex-col gap-2 h-[40vh] w-full"><Textareaname="textOrLink"placeholder="Enter text or link..."className="shadow-sm focus:border-none flex-1 resize-none bg"style={{outline: "none",overflow: "auto",scrollbarWidth: "none",msOverflowStyle: "none",}}/><style jsx>{`textarea::-webkit-scrollbar {display: none;}`}</style><TooltipProvider><Tooltip><TooltipTrigger asChild><div><Buttontype="submit"className="mt-2 w-full bg-pink-200 text-purple-500 hover:bg-pink-100"disabled={!isSignedIn}>Convert</Button></div></TooltipTrigger>{!isSignedIn && (<TooltipContent>You need to sign in to convert</TooltipContent>)}</Tooltip></TooltipProvider></div></form></div>{loading ? (<div className="flex flex-col items-center justify-center gap-2"><div className="animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-purple-500"></div><p className="text-lg text-purple-400">converting...</p></div>) : imgUrl ? (<div className="flex flex-col items-center justify-center gap-2"><imgsrc={imgUrl}alt="Image 1"className="w-full h-full object-contain shadow-sm"/><div className="flex gap-x-4 w-full justify-center"><Link href={editUrl} target="_blank" className="w-full"><Button className="bg-pink-200 text-purple-500 w-full hover:bg-pink-100">Edit in TreeMind</Button></Link><ahref={imgUrl}download="mindmap.jpeg"target="_blank"className="w-full"><Button className="bg-pink-200 text-purple-500 w-full hover:bg-pink-100">Download</Button></a></div></div>) : (<div className="flex flex-col items-center justify-center gap-2"><p className="text-lg text-purple-400">Waiting For Conversion<Typewriterwords={["..."]}loop={true}cursorcursorStyle=""typeSpeed={200}deleteSpeed={50}delaySpeed={2000}/></p>{/* <div className="flex gap-x-4 w-full justify-center"><Skeleton className="w-full" /><Skeleton className="w-full" /></div> */}</div>)}</div></section></header></div>);
}

这样,用户输入文字,点击按钮后,就能实现生成的逻辑:
在这里插入图片描述
在这里插入图片描述
生成完成后,用户可以点击按钮选择下载或是继续编辑。
在这里插入图片描述

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

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

相关文章

【图解大数据技术】Hive、HBase

【图解大数据技术】Hive、HBase Hive数据仓库Hive的执行流程Hive架构数据导入Hive HBaseHBase简介HBase架构HBase的列式存储HBase建表流程HBase数据写入流程HBase数据读取流程 Hive Hive是基于Hadoop的一个数据仓库工具&#xff0c;Hive的数据存储在HDFS上&#xff0c;底层基于…

Linux 常用命令 - dd 【复制及转换文件内容】

简介 dd 命令源自于磁盘复制&#xff08;disk dump&#xff09;的缩写&#xff0c;是 Linux 和 Unix 系统中用于转换和复制文件的一个强大工具。它可以在复制过程中进行格式转换&#xff0c;支持不同的块大小&#xff0c;能够直接对硬盘设备进行操作&#xff0c;非常适合进行备…

android里面json操作

1.读取assets下面xzhd/aikit/pck.json String json = null; try { InputStream is = activity.getAssets().open(aikitPathInData+"xzhd/aikit/pck.json"); int size = is.available(); byte[] buffer = new byte…

容器进程

一、容器进程和宿主机进程的关系 容器在进程空间上和宿主机是隔离的&#xff0c;每创建一个容器&#xff0c;该容器都有一个独属的进程空间简称PID NameSpace。但是容器本质也是一个进程&#xff0c;自然是由其父进程创建的&#xff0c;这个可以使用ps aux命令验证。 | 容器视…

Windows 下写C++代码的必备

在 Windows 下写代码&#xff0c;还需要用到 Windows.h 头文件的话&#xff0c;需要记住以下两点&#xff1a; 一定要 predefine 一个宏&#xff0c;NOMINMAX&#xff0c;禁用掉 windows 定义的 min 和 max 宏 #include <winsock.h> #define WIN32_LEAN_AND_MEAN #defin…

【高考志愿】材料科学与工程

目录 一、专业概述 二、就业前景与方向 三、院校选择和报考建议 3.1 院校选择 3.2 报考建议 四、材料科学与工程专业排名 高考志愿选择材料科学与工程专业时&#xff0c;确实是一个需要深思熟虑的决策过程。以下是更详细和扩展的考虑因素&#xff1a; 一、专业概述 学习…

Tesseract Python 图片文字识别入门

1、安装tesseract Index of /tesseract https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v5.3.0.20221214.exe 2、安装中文语言包 https://digi.bib.uni-mannheim.de/tesseract/tessdata_fast/ 拷贝到C:\Program Files\Tesseract-OCR\tessdata 3、注…

Java面试题:描述你如何向非技术人员解释技术概念

向非技术人员解释技术概念时&#xff0c;需要使用简单明了的语言&#xff0c;并结合类比和实际例子&#xff0c;使复杂的技术内容变得易于理解。以下是一些具体的策略&#xff1a; 使用类比&#xff1a; 熟悉的场景类比&#xff1a;将技术概念与日常生活中的熟悉事物进行类比。…

每天写java到期末考试--实验四---接口与抽象类--6.29

第一部分&#xff1a;接口与类的实现 Shape接口 java复制代码public interface Shape { double getArea(); double getPerimeter(); } Circle类 public class Circle implements Shape { private double r; public Circle(double r) { this.r r; } Override publ…

ISO26262标准

什么是ISO26262&#xff1f; ISO 26262(国际功能安全标准)是一个涵盖整个汽车产品开发过程的汽车功能安全标准。ISO 26262继承或改编自工业自动化行业的安全要求标准IEC61508&#xff0c;但专门为汽车行业量身定制。最新版本是ISO26262-1:2018。 它包括诸如需求分析、安全分析…

STM32CubeMx的学习记录系列(2)- STM32G474RET6

最近有个小比赛&#xff0c;需要用到G4&#xff0c;不过找了一圈没有找到标准库的代码&#xff0c;只能使用hal&#xff0c;用CubeMX来生成配置代码。 共同特点 ARDUINO Uno V3 扩展连接器 ST morpho 扩展引脚接头&#xff0c;可完全访问所有 STM32 I/O 采用LQFP64或LQFP48封…

51单片机第9步_结构和联合

本章重点学习结构和联合。 //结构和联合应用举例 #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; #include <stdio.h> //包含头文件stdio.h //_getkey();从串口读入一个字符; //putchar();向串口发送一个字节; //printf();向串口发送一串字节; /…

Llamaindex实战-在本地使用多种LLM

Llamaindex实战-在本地使用多种LLM 有关我们支持的大语言模型列表及其功能比较&#xff0c;请查看我们的大语言模型模块指南。 使用LLM的基本范式 构建基于 LLM 的应用程序时的第一步是决定使用哪个 LLM&#xff1b;也可以使用多个。 LLM 可用于管道的多个不同阶段&#xff…

6.29学习笔记

马克思 “流”&#xff1a;两个选它纺织厂生产的棉花属于&#xff1a;不变资本、流动资本&#xff1b;机器属于&#xff1a;不变资本、固定资本剩余价值生产的基本方法&#xff1a;绝对剩余价值、相对剩余价值货币的基本职能&#xff1a;价值尺度&#xff0c;流通手段“价格围…

p2p、分布式,区块链笔记: libp2p基础

通信密钥 noise::{Keypair, X25519Spec} X25519/Ed25519类似RSA 算法。Noise 用于设计和实现安全通信协议。它允许通信双方在没有预先共享密钥的情况下进行安全的密钥交换&#xff0c;并通过加密和身份验证保护通信内容。libp2p 提供了对 Noise 协议的原生支持&#xff0c;它允…

20、PHP字符串的排列(含源码)

题目&#xff1a; PHP字符串的排列&#xff1f; 描述&#xff1a; 输入一个字符串,按字典序打印出该字符串中字符的所有排列。 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述&#xff1a; 输入一个字符串,长度不超过9(可…

尺度函数在图像处理中的应用与优化

尺度函数在图像处理中的应用与优化 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨尺度函数在图像处理中的应用与优化。尺度函数是图像处理中…

spring快速上手

一、基础概念 1.使用spring后&#xff0c;被spring管理的类&#xff0c;不需要再new。 2.要想类被spring管理&#xff0c;则需要通过bean的方式&#xff0c;把类引入到spirng的配置文件中。 二、导入spring框架 导入spring依赖 <properties><maven.compiler.sourc…

2-requests模块(6节课学会爬虫)

2-requests模块&#xff08;6节课学会爬虫&#xff09; 1&#xff0c;安装requests2&#xff0c;发送get&#xff0c;post请求&#xff0c;获取响应3&#xff0c;response的方法方法一&#xff08;Response.text&#xff09;方法二&#xff08;response.content.decode()&#…

Docker 查看源地址/仓库地址,更改

一、源地址文件配置路径。若有docker文件夹&#xff0c;没有json&#xff0c;可以新增&#xff0c;复制进去内容 /etc/docker/daemon.json {"registry-mirrors": ["https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com"&#xff0c;&q…