4、前后端联调文生文、文生图事件

4、前后端联调文生文、文生图事件

原文地址

1、底部【发送按钮】事件触发调用后端AI程序逻辑

html 复制代码
<!-- 前端模板如下: -->
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>小薛博客LLM大模型实战</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 引入 layui.css -->
    <link href="/layui/css/layui.css" rel="stylesheet">
</head>

<body>
<div class="layui-layout layui-layout-admin">
    
    <!--4444444-->
    <div id="footer-chat" class="layui-footer" style="height: 80px;line-height: 80px;">
        <!-- 底部固定区域 -->
        <div style="width: 80%;">
            <div class="layui-input-group" style="width: 100%;">
                <input type="text" id="question-input" style="margin-top: 20px;margin-left: 120px;" placeholder="输入问题..."
                       class="layui-input">
                <div class="layui-input-suffix">
                    <button type="button" id="question-send"  style="margin-left: 80px;" lay-on="question-send" class="layui-btn layui-btn-radius">发送
                    </button>
                </div>
            </div>
        </div>
    </div>
</div>
 

<!-- 引入 layui.js -->
<script src="/layui/layui.js"></script>
<script>
  //JS
  layui.use(['element', 'layer', 'util'], function(){
    var element = layui.element;
    var layer = layui.layer;
    var util = layui.util;
    //var $ = layui.$;
    var jQuery = layui.$;

    var question_type = "chat"; // 默认对话问答文生文,当前在使用聊天功能

    util.on('lay-on',{
      //对话问答(文生文)
      'chat-nav-show':function () {
        jQuery("#chat-nav").show();
        jQuery("#draw-nav").hide();
        jQuery("#discuss-nav").hide();
        //对话问答-点击后顶部导航栏显示第一个标签页ChatGPT
        var showDivId = "chat-chatgpt-content";
        jQuery("#" + showDivId).show();
        jQuery("#" + showDivId).siblings().hide();
        //对话问答-点击后顶部导航栏显示第一个标签页ChatGPT+底部光标跟随
        jQuery("#chat-nav").find("li").removeClass("layui-this");
        jQuery("#chat-nav").find("li").eq(1).addClass("layui-this");
        // 显示最下面【输入问题】对话框
        jQuery("#footer-chat").show();
        //底部输入框对话类型
        question_type = "chat";
      },
      //对话问图(文生图)
      'draw-nav-show':function () {
        jQuery("#draw-nav").show();
        jQuery("#chat-nav").hide();
        jQuery("#discuss-nav").hide();
        //左侧对话问图-点击后顶部导航栏显示第一个标签页ChatGPT
        var showDivId = "draw-chatgpt-content";
        jQuery("#" + showDivId).show();
        jQuery("#" + showDivId).siblings().hide();
        //左侧对话问图-点击后顶部导航栏显示第一个标签页ChatGPT+底部光标跟随
        jQuery("#draw-nav").find("li").removeClass("layui-this");
        jQuery("#draw-nav").find("li").eq(1).addClass("layui-this");
        // 显示最下面【输入问题】对话框
        jQuery("#footer-chat").show();
        //底部输入框对话类型
        question_type = "draw";
      },
      //左侧话题讨论
      'discuss-nav-show':function () {
        jQuery("#discuss-nav").show();
        jQuery("#chat-nav").hide();
        jQuery("#draw-nav").hide();
        //左侧话题讨论-点击后顶部导航栏显示第一个标签页ChatGPT
        var showDivId = "discuss-content";
        jQuery("#" + showDivId).show();
        jQuery("#" + showDivId).siblings().hide();
        jQuery("#discuss-nav").find("li").removeClass("layui-this");
        jQuery("#discuss-nav").find("li").eq(1).addClass("layui-this");
        // 隐藏最下面【输入问题】对话框
        jQuery("#footer-chat").hide();
      },
      //给lay-on="nav-change-content"添加函数说明,根据标签页切换显示不同的内容
      'nav-change-content':function (e) {
        var showDivId = jQuery(e).attr("lay-data");
        jQuery("#" + showDivId).show(); // 显示自己的内容
        jQuery("#" + showDivId).siblings().hide(); // 隐藏所有同级 div 的内容
      },
      //给主页底部【发送】按钮添加事件
      'question-send':function () {
        //输入问题...对话框内容
        var question = jQuery("#question-input").val();
        //非空判断
        if (question == null || question == "") {
          layer.msg("提问词不能为空,请先输入问题!");
          return;
        }
        if(question_type == "chat") {//文生文
          //前端发送ajax请求到后端restful
          jQuery.ajax({
            url:"/openai/chat",
            type: "get",
            data:{question:question},
            success:function (result) {

            }
          });
        }else if(question_type == "draw"){//文生图
          //前端发送ajax请求到后端restful
          jQuery.ajax({
            url:"/openai/draw",
            type: "post",
            data:{question:question},
            success:function (result) {

            }
          });
        }
      },
      //关于我们
      'about-us':function () {
        layer.msg('触发了事件-关于我们');
      },
    });


    //头部事件
    util.event('lay-header-event', {
      menuLeft: function(othis){ // 左侧菜单事件
        layer.msg('展开左侧菜单的操作', {icon: 0});
      },
      menuRight: function(){  // 右侧菜单事件
        layer.open({
          type: 1,
          title: '更多',
          content: '<div style="padding: 15px;">处理右侧面板的操作</div>',
          area: ['260px', '100%'],
          offset: 'rt', // 右上角
          anim: 'slideLeft', // 从右侧抽屉滑出
          shadeClose: true,
          scrollbar: false
        });
      }
    });
  });
</script>
</body>
</html>

完整index.html

html 复制代码
<!-- 前端模板如下: -->
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>小薛博客LLM大模型实战</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 引入 layui.css -->
    <link href="/layui/css/layui.css" rel="stylesheet">
</head>

<body>
<div class="layui-layout layui-layout-admin">
    <!--11111111-->
    <div class="layui-header">
        <div class="layui-logo layui-hide-xs layui-bg-black">小薛博客LLM大模型实战</div>
        <!-- 头部区域(可配合layui 已有的水平导航) -->
        <ul id="chat-nav" class="layui-nav layui-layout-left">
            <!-- 移动端显示 -->
            <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">
                <i class="layui-icon layui-icon-spread-left"></i>
            </li>
            <li class="layui-nav-item layui-hide-xs layui-this" lay-on="nav-change-content"  lay-data="chat-chatgpt-content"><a href="javascript:;">ChatGPT</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="chat-tongyi-content"><a href="javascript:;">通义千问</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="chat-wenxin-content"><a href="javascript:;">文心一言</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="chat-xunfei-content"><a href="javascript:;">科大讯飞</a></li>
        </ul>
        <ul id="draw-nav" class="layui-nav layui-layout-left">
            <!-- 移动端显示 -->
            <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">
                <i class="layui-icon layui-icon-spread-left"></i>
            </li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="draw-chatgpt-content"><a href="javascript:;">ChatGPT</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="draw-tongyi-content"><a href="javascript:;">通义千问</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="draw-wenxin-content"><a href="javascript:;">文心一言</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="draw-xunfei-content"><a href="javascript:;">科大讯飞</a></li>
        </ul>
        <!-- 头部区域(可配合layui 已有的水平导航) -->
        <ul id="discuss-nav" class="layui-nav layui-layout-left" style="display: none">
            <!-- 移动端显示 -->
            <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">
                <i class="layui-icon layui-icon-spread-left"></i>
            </li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content" lay-data="discuss-content"><a href="javascript:;">推荐</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content" lay-data="discuss-content-new"><a href="javascript:;">最新</a></li>
        </ul>
        <ul class="layui-nav layui-layout-right">
            <li class="layui-nav-item layui-hide layui-show-sm-inline-block">
                <a href="javascript:;">
                    <img src="//unpkg.com/[email protected]/img/layui/icon-v2.png" class="layui-nav-img">
                    tester
                </a>
                <dl class="layui-nav-child">
                    <dd><a href="javascript:;">Your Profile</a></dd>
                    <dd><a href="javascript:;">Settings</a></dd>
                    <dd><a href="javascript:;">Sign out</a></dd>
                </dl>
            </li>
            <li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>
                <a href="javascript:;">
                    <i class="layui-icon layui-icon-more-vertical"></i>
                </a>
            </li>
        </ul>
    </div>
    <!--22222222-->
    <div class="layui-side layui-bg-black">
        <div class="layui-side-scroll">
            <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
            <ul class="layui-nav layui-nav-tree" lay-filter="test">
                <li class="layui-nav-item layui-nav-itemed">
                    <a class="" href="javascript:;">AI功能集</a>
                    <dl class="layui-nav-child">
                        <dd><a href="javascript:;" lay-on="chat-nav-show">对话问答(文生文)</a></dd>
                        <dd><a href="javascript:;" lay-on="draw-nav-show">对话问图(文生图)</a></dd>
                    </dl>
                </li>
                <li class="layui-nav-item" lay-on="discuss-nav-show"><a href="javascript:;">话题讨论</a></li>
                <li class="layui-nav-item" lay-on="about-us"><a href="javascript:;">关于我们</a></li>
            </ul>
        </div>
    </div>

    <!--3333333-->
    <div class="layui-body">
        <!-- 内容主体区域 -->
        <div style="padding: 15px;">
            <div>
                <div id="chat-chatgpt-content" class="layui-card layui-panel">
                    <div class="layui-card-header layui-font-16">
                        ChatGPT提出的问题1
                    </div>
                    <div class="layui-card-body">
                        ChatGPT回答的问题
                    </div>
                </div>
                <div id="chat-tongyi-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        tongyi提出的问题1
                    </div>
                    <div class="layui-card-body">
                        tongyi回答的问题
                    </div>
                </div>
                <div id="chat-wenxin-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        wenxin提出的问题1
                    </div>
                    <div class="layui-card-body">
                        wenxin回答的问题
                    </div>
                </div>
                <div id="chat-xunfei-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        xunfei提出的问题1
                    </div>
                    <div class="layui-card-body">
                        xunfei回答的问题
                    </div>
                </div>

                <div id="draw-chatgpt-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        draw-ChatGPT
                    </div>
                    <div class="layui-card-body">
                        draw-ChatGPT画的回答
                    </div>
                </div>
                <div id="draw-tongyi-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        draw-tongyi
                    </div>
                    <div class="layui-card-body">
                        draw-tongyi问题
                    </div>
                </div>
                <div id="draw-wenxin-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        draw-wenxin
                    </div>
                    <div class="layui-card-body">
                        draw-wenxin画图
                    </div>
                </div>
                <div id="draw-xunfei-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        draw-xunfei
                    </div>
                    <div class="layui-card-body">
                        draw-xunfei回答
                    </div>
                </div>
                <div id="discuss-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        话题讨论-推荐
                    </div>
                    <div class="layui-card-body">
                        话题讨论-推荐详细情况
                    </div>
                </div>
                <div id="discuss-content-new" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        话题讨论-最新
                    </div>
                    <div class="layui-card-body">
                        话题讨论-最新详细情况
                    </div>
                </div>
            </div>
        </div>
    </div>
    <!--4444444-->
    <div id="footer-chat" class="layui-footer" style="height: 80px;line-height: 80px;">
        <!-- 底部固定区域 -->
        <div style="width: 80%;">
            <div class="layui-input-group" style="width: 100%;">
                <input type="text" id="question-input" style="margin-top: 20px;margin-left: 120px;" placeholder="输入问题..."
                       class="layui-input">
                <div class="layui-input-suffix">
                    <button type="button" id="question-send"  style="margin-left: 80px;" lay-on="question-send" class="layui-btn layui-btn-radius">发送
                    </button>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- 引入 layui.js -->
<script src="/layui/layui.js"></script>
<script>
    //JS
    layui.use(['element', 'layer', 'util'], function(){
        var element = layui.element;
        var layer = layui.layer;
        var util = layui.util;
        //var $ = layui.$;
        var jQuery = layui.$;

        var question_type = "chat"; // 默认对话问答文生文,当前在使用聊天功能

        util.on('lay-on',{
            //对话问答(文生文)
            'chat-nav-show':function () {
                jQuery("#chat-nav").show();
                jQuery("#draw-nav").hide();
                jQuery("#discuss-nav").hide();
                //对话问答-点击后顶部导航栏显示第一个标签页ChatGPT
                var showDivId = "chat-chatgpt-content";
                jQuery("#" + showDivId).show();
                jQuery("#" + showDivId).siblings().hide();
                //对话问答-点击后顶部导航栏显示第一个标签页ChatGPT+底部光标跟随
                jQuery("#chat-nav").find("li").removeClass("layui-this");
                jQuery("#chat-nav").find("li").eq(1).addClass("layui-this");
                // 显示最下面【输入问题】对话框
                jQuery("#footer-chat").show();
                //底部输入框对话类型
                question_type = "chat";
            },
            //对话问图(文生图)
            'draw-nav-show':function () {
                jQuery("#draw-nav").show();
                jQuery("#chat-nav").hide();
                jQuery("#discuss-nav").hide();
                //左侧对话问图-点击后顶部导航栏显示第一个标签页ChatGPT
                var showDivId = "draw-chatgpt-content";
                jQuery("#" + showDivId).show();
                jQuery("#" + showDivId).siblings().hide();
                //左侧对话问图-点击后顶部导航栏显示第一个标签页ChatGPT+底部光标跟随
                jQuery("#draw-nav").find("li").removeClass("layui-this");
                jQuery("#draw-nav").find("li").eq(1).addClass("layui-this");
                // 显示最下面【输入问题】对话框
                jQuery("#footer-chat").show();
                //底部输入框对话类型
                question_type = "draw";
            },
            //左侧话题讨论
            'discuss-nav-show':function () {
                jQuery("#discuss-nav").show();
                jQuery("#chat-nav").hide();
                jQuery("#draw-nav").hide();
                //左侧话题讨论-点击后顶部导航栏显示第一个标签页ChatGPT
                var showDivId = "discuss-content";
                jQuery("#" + showDivId).show();
                jQuery("#" + showDivId).siblings().hide();
                jQuery("#discuss-nav").find("li").removeClass("layui-this");
                jQuery("#discuss-nav").find("li").eq(1).addClass("layui-this");
                // 隐藏最下面【输入问题】对话框
                jQuery("#footer-chat").hide();
            },
            //给lay-on="nav-change-content"添加函数说明,根据标签页切换显示不同的内容
            'nav-change-content':function (e) {
                var showDivId = jQuery(e).attr("lay-data");
                jQuery("#" + showDivId).show(); // 显示自己的内容
                jQuery("#" + showDivId).siblings().hide(); // 隐藏所有同级 div 的内容
            },
            //给主页底部【发送】按钮添加事件
            'question-send':function () {
                //输入问题...对话框内容
                var question = jQuery("#question-input").val();
                //非空判断
                if (question == null || question == "") {
                    layer.msg("提问词不能为空,请先输入问题!");
                    return;
                }
                if(question_type == "chat") {//文生文
                    //前端发送ajax请求到后端restful
                    jQuery.ajax({
                        url:"/openai/chat",
                        type: "get",
                        data:{question:question},
                        success:function (result) {

                        }
                    });
                }else if(question_type == "draw"){//文生图
                    //前端发送ajax请求到后端restful
                    jQuery.ajax({
                        url:"/openai/draw",
                        type: "post",
                        data:{question:question},
                        success:function (result) {

                        }
                    });
                }
            },
            //关于我们
            'about-us':function () {
                layer.msg('触发了事件-关于我们');
            },
        });


        //头部事件
        util.event('lay-header-event', {
            menuLeft: function(othis){ // 左侧菜单事件
                layer.msg('展开左侧菜单的操作', {icon: 0});
            },
            menuRight: function(){  // 右侧菜单事件
                layer.open({
                    type: 1,
                    title: '更多',
                    content: '<div style="padding: 15px;">处理右侧面板的操作</div>',
                    area: ['260px', '100%'],
                    offset: 'rt', // 右上角
                    anim: 'slideLeft', // 从右侧抽屉滑出
                    shadeClose: true,
                    scrollbar: false
                });
            }
        });
    });
</script>
</body>
</html>

2、OpenAIController

java 复制代码
package com.xx.controller;

import com.xx.common.Result;
import com.xx.exception.BusinessException;
import com.xx.utils.ValidationUtil;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @auther xx
 * @create 2024-11-02 19:04
 */
@RestController
@RequestMapping("/openai")
public class OpenAIController {
    private Logger log = LoggerFactory.getLogger(this.getClass());

    @Resource
    private OpenAiChatModel openAiChatClient;

    @GetMapping(value = "/chat")
    @Operation(summary = "调用 Open AI 聊天接口")
    public Result chat(String question) {
        //测试假如等于XXX敏感词
        if (question.equals("abcd")) {
            throw new BusinessException("敏感词");
        }
        if (ValidationUtil.isEmpty(question)) {
            // 输入为空
            return Result.error("请求参数不能为空");
        }
        // 调用 Open AI 接口
        return Result.ok(openAiChatClient.call(question));
    }
}

3、调通后端AI后前台进行显示和页面细节调整

html 复制代码
if(question_type == "chat") {//文生文
  //前端发送ajax请求到后端restful
  jQuery.ajax({
      url:"/openai/chat",
      type: "get",
      data:{question:question},
      success:function (result) {
          if(result.code == 200){

              var createHTML = '          <div class="layui-card layui-panel">\n' +
                  '            <div class="layui-card-header layui-font-16">\n' +
                  question+'            \n' +
                  '            </div>\n' +
                  result.result+'            <div class="layui-card-body">\n' +
                  '              \n' +
                  '            </div>\n' +
                  '          </div>';
              jQuery("#chat-chatgpt-content").prepend(createHTML);
              jQuery("#chat-chatgpt-content").val("");
              jQuery("#question-input").val("");
          }else{
              layer.msg(result.code+"\t"+result.message);
          }
      }
  });

4、openai生成图片

https://docs.spring.io/spring-ai/reference/api/image/openai-image.html

java 复制代码
package com.xx.controller;

import com.xx.common.Result;
import com.xx.exception.BusinessException;
import com.xx.utils.ValidationUtil;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.OpenAiImageModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @auther xx
 * @create 2024-11-02 19:04
 */
@RestController
@RequestMapping("/openai")
public class OpenAIController {
    private Logger log = LoggerFactory.getLogger(this.getClass());
    
    @Resource
    private OpenAiImageModel openAiImageClient;
    
    @GetMapping(value = "/draw")
    @Operation(summary = "绘图功能")
    public Result draw(String question) {
        String imageUrl = null;
        if (ValidationUtil.isEmpty(question)) {
            // 输入为空
            return Result.error("请求参数不能为空");
        }
        // 调用 Open AI 接口,土生图调用openai不稳定,暂时写死图片地址,调用成功返回结果如下:
        ImageResponse imageResponse = openAiImageClient.call(new ImagePrompt(question));
        imageUrl = imageResponse.getResult().getOutput().getUrl();
        //自己写死
//        imageUrl = "http://gips2.baidu.com/it/u=195724436,3554684702&fm=3028&app=3028&f=JPEG&fmt=auto?w=1280&h=960";
        return Result.ok(imageUrl);
    }
}
html 复制代码
<!-- 前端模板如下: -->
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>小薛博客LLM大模型实战</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 引入 layui.css -->
    <link href="/layui/css/layui.css" rel="stylesheet">
</head>

<body>
<div class="layui-layout layui-layout-admin">
    <!--11111111-->
    <div class="layui-header">
        <div class="layui-logo layui-hide-xs layui-bg-black">小薛博客LLM大模型实战</div>
        <!-- 头部区域(可配合layui 已有的水平导航) -->
        <ul id="chat-nav" class="layui-nav layui-layout-left">
            <!-- 移动端显示 -->
            <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">
                <i class="layui-icon layui-icon-spread-left"></i>
            </li>
            <li class="layui-nav-item layui-hide-xs layui-this" lay-on="nav-change-content"  lay-data="chat-chatgpt-content"><a href="javascript:;">ChatGPT</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="chat-tongyi-content"><a href="javascript:;">通义千问</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="chat-wenxin-content"><a href="javascript:;">文心一言</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="chat-xunfei-content"><a href="javascript:;">科大讯飞</a></li>
        </ul>
        <ul id="draw-nav" class="layui-nav layui-layout-left">
            <!-- 移动端显示 -->
            <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">
                <i class="layui-icon layui-icon-spread-left"></i>
            </li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="draw-chatgpt-content"><a href="javascript:;">ChatGPT</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="draw-tongyi-content"><a href="javascript:;">通义千问</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="draw-wenxin-content"><a href="javascript:;">文心一言</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content"  lay-data="draw-xunfei-content"><a href="javascript:;">科大讯飞</a></li>
        </ul>
        <!-- 头部区域(可配合layui 已有的水平导航) -->
        <ul id="discuss-nav" class="layui-nav layui-layout-left" style="display: none">
            <!-- 移动端显示 -->
            <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">
                <i class="layui-icon layui-icon-spread-left"></i>
            </li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content" lay-data="discuss-content"><a href="javascript:;">推荐</a></li>
            <li class="layui-nav-item layui-hide-xs" lay-on="nav-change-content" lay-data="discuss-content-new"><a href="javascript:;">最新</a></li>
        </ul>
        <ul class="layui-nav layui-layout-right">
            <li class="layui-nav-item layui-hide layui-show-sm-inline-block">
                <a href="javascript:;">
                    <img src="//unpkg.com/[email protected]/img/layui/icon-v2.png" class="layui-nav-img">
                    tester
                </a>
                <dl class="layui-nav-child">
                    <dd><a href="javascript:;">Your Profile</a></dd>
                    <dd><a href="javascript:;">Settings</a></dd>
                    <dd><a href="javascript:;">Sign out</a></dd>
                </dl>
            </li>
            <li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>
                <a href="javascript:;">
                    <i class="layui-icon layui-icon-more-vertical"></i>
                </a>
            </li>
        </ul>
    </div>
    <!--22222222-->
    <div class="layui-side layui-bg-black">
        <div class="layui-side-scroll">
            <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
            <ul class="layui-nav layui-nav-tree" lay-filter="test">
                <li class="layui-nav-item layui-nav-itemed">
                    <a class="" href="javascript:;">AI功能集</a>
                    <dl class="layui-nav-child">
                        <dd><a href="javascript:;" lay-on="chat-nav-show">对话问答(文生文)</a></dd>
                        <dd><a href="javascript:;" lay-on="draw-nav-show">对话问图(文生图)</a></dd>
                    </dl>
                </li>
                <li class="layui-nav-item" lay-on="discuss-nav-show"><a href="javascript:;">话题讨论</a></li>
                <li class="layui-nav-item" lay-on="about-us"><a href="javascript:;">关于我们</a></li>
            </ul>
        </div>
    </div>

    <!--3333333-->
    <div class="layui-body">
        <!-- 内容主体区域 -->
        <div style="padding-top: 15px;padding-bottom: 80px">
            <div>
                <div id="chat-chatgpt-content">

                </div>
                <div id="chat-tongyi-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        tongyi提出的问题1
                    </div>
                    <div class="layui-card-body">
                        tongyi回答的问题
                    </div>
                </div>
                <div id="chat-wenxin-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        wenxin提出的问题1
                    </div>
                    <div class="layui-card-body">
                        wenxin回答的问题
                    </div>
                </div>
                <div id="chat-xunfei-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        xunfei提出的问题1
                    </div>
                    <div class="layui-card-body">
                        xunfei回答的问题
                    </div>
                </div>

                <div id="draw-chatgpt-content" class="layui-card layui-panel" style="display: none">

                </div>
                <div id="draw-tongyi-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        draw-tongyi
                    </div>
                    <div class="layui-card-body">
                        draw-tongyi问题
                    </div>
                </div>
                <div id="draw-wenxin-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        draw-wenxin
                    </div>
                    <div class="layui-card-body">
                        draw-wenxin画图
                    </div>
                </div>
                <div id="draw-xunfei-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        draw-xunfei
                    </div>
                    <div class="layui-card-body">
                        draw-xunfei回答
                    </div>
                </div>
                <div id="discuss-content" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        话题讨论-推荐
                    </div>
                    <div class="layui-card-body">
                        话题讨论-推荐详细情况
                    </div>
                </div>
                <div id="discuss-content-new" class="layui-card layui-panel" style="display: none">
                    <div class="layui-card-header layui-font-16">
                        话题讨论-最新
                    </div>
                    <div class="layui-card-body">
                        话题讨论-最新详细情况
                    </div>
                </div>
            </div>
        </div>
    </div>
    <!--4444444-->
    <div id="footer-chat" class="layui-footer" style="height: 80px;line-height: 80px;">
        <!-- 底部固定区域 -->
        <div style="width: 80%;">
            <div class="layui-input-group" style="width: 100%;">
                <input type="text" id="question-input" style="margin-top: 20px;margin-left: 120px;" placeholder="输入问题..."
                       class="layui-input">
                <div class="layui-input-suffix">
                    <button type="button" id="question-send"  style="margin-left: 80px;" lay-on="question-send" class="layui-btn layui-btn-radius">发送
                    </button>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- 引入 layui.js -->
<script src="/layui/layui.js"></script>
<script>
    //JS
    layui.use(['element', 'layer', 'util'], function(){
        var element = layui.element;
        var layer = layui.layer;
        var util = layui.util;
        //var $ = layui.$;
        var jQuery = layui.$;

        var question_type = "chat"; // 默认对话问答文生文,当前在使用聊天功能

        util.on('lay-on',{
            //对话问答(文生文)
            'chat-nav-show':function () {
                jQuery("#chat-nav").show();
                jQuery("#draw-nav").hide();
                jQuery("#discuss-nav").hide();
                //对话问答-点击后顶部导航栏显示第一个标签页ChatGPT
                var showDivId = "chat-chatgpt-content";
                jQuery("#" + showDivId).show();
                jQuery("#" + showDivId).siblings().hide();
                //对话问答-点击后顶部导航栏显示第一个标签页ChatGPT+底部光标跟随
                jQuery("#chat-nav").find("li").removeClass("layui-this");
                jQuery("#chat-nav").find("li").eq(1).addClass("layui-this");
                // 显示最下面【输入问题】对话框
                jQuery("#footer-chat").show();
                //底部输入框对话类型
                question_type = "chat";
            },
            //对话问图(文生图)
            'draw-nav-show':function () {
                jQuery("#draw-nav").show();
                jQuery("#chat-nav").hide();
                jQuery("#discuss-nav").hide();
                //左侧对话问图-点击后顶部导航栏显示第一个标签页ChatGPT
                var showDivId = "draw-chatgpt-content";
                jQuery("#" + showDivId).show();
                jQuery("#" + showDivId).siblings().hide();
                //左侧对话问图-点击后顶部导航栏显示第一个标签页ChatGPT+底部光标跟随
                jQuery("#draw-nav").find("li").removeClass("layui-this");
                jQuery("#draw-nav").find("li").eq(1).addClass("layui-this");
                // 显示最下面【输入问题】对话框
                jQuery("#footer-chat").show();
                //底部输入框对话类型
                question_type = "draw";
            },
            //左侧话题讨论
            'discuss-nav-show':function () {
                jQuery("#discuss-nav").show();
                jQuery("#chat-nav").hide();
                jQuery("#draw-nav").hide();
                //左侧话题讨论-点击后顶部导航栏显示第一个标签页ChatGPT
                var showDivId = "discuss-content";
                jQuery("#" + showDivId).show();
                jQuery("#" + showDivId).siblings().hide();
                jQuery("#discuss-nav").find("li").removeClass("layui-this");
                jQuery("#discuss-nav").find("li").eq(1).addClass("layui-this");
                // 隐藏最下面【输入问题】对话框
                jQuery("#footer-chat").hide();
            },
            //给lay-on="nav-change-content"添加函数说明,根据标签页切换显示不同的内容
            'nav-change-content':function (e) {
                var showDivId = jQuery(e).attr("lay-data");
                jQuery("#" + showDivId).show(); // 显示自己的内容
                jQuery("#" + showDivId).siblings().hide(); // 隐藏所有同级 div 的内容
            },
            //给主页底部【发送】按钮添加事件
            'question-send':function () {
                //输入问题...对话框内容
                var question = jQuery("#question-input").val();
                //非空判断
                if (question == null || question == "") {
                    layer.msg("提问词不能为空,请先输入问题!");
                    return;
                }
                if(question_type == "chat") {//文生文
                    //前端发送ajax请求到后端restful
                    jQuery.ajax({
                        url:"/openai/chat",
                        type: "get",
                        data:{question:question},
                        success:function (result) {
                            if(result.code == 200){

                                var createHTML = '          <div class="layui-card layui-panel">\n' +
                                    '            <div class="layui-card-header layui-font-16">\n' +
                                    question+'            \n' +
                                    '            </div>\n' +
                                    result.result+'            <div class="layui-card-body">\n' +
                                    '              \n' +
                                    '            </div>\n' +
                                    '          </div>';
                                jQuery("#chat-chatgpt-content").prepend(createHTML);
                                jQuery("#chat-chatgpt-content").val("");
                                jQuery("#question-input").val("");
                            }else{
                                layer.msg(result.code+"\t"+result.message);
                            }
                        }
                    });
                }else if(question_type == "draw"){//文生图
                    //前端发送ajax请求到后端restful
                    jQuery.ajax({
                        url:"/openai/draw",
                        type: "get",
                        data:{question:question},
                        success:function (result) {
                            if(result.code == 200){
                                var createHTML = '<div>\n' +
                                    '                        <div class="layui-card-header layui-font-16">\n' +
                                    question +
                                    '                        </div>\n' +
                                    '                        <div class="layui-card-body">\n<img src="' +
                                    result.result+
                                    '">                        </div>\n' +
                                    '             </div>';
                                jQuery("#draw-chatgpt-content").prepend(createHTML);
                                jQuery("#draw-chatgpt-content").val("");
                                jQuery("#question-input").val("");
                            }else{
                                layer.msg(result.code+"\t"+result.message);
                            }
                        }
                    });
                }
            },
            //关于我们
            'about-us':function () {
                layer.msg('触发了事件-关于我们');
            },
        });


        //头部事件
        util.event('lay-header-event', {
            menuLeft: function(othis){ // 左侧菜单事件
                layer.msg('展开左侧菜单的操作', {icon: 0});
            },
            menuRight: function(){  // 右侧菜单事件
                layer.open({
                    type: 1,
                    title: '更多',
                    content: '<div style="padding: 15px;">处理右侧面板的操作</div>',
                    area: ['260px', '100%'],
                    offset: 'rt', // 右上角
                    anim: 'slideLeft', // 从右侧抽屉滑出
                    shadeClose: true,
                    scrollbar: false
                });
            }
        });
    });
</script>
</body>
</html>
相关推荐
努力学习的明4 分钟前
Spring MVC 对 JavaWeb 的优化:从核心组件到注解
java·spring·mvc·web
小雅痞6 分钟前
[Java][Leetcode middle] 238. 除自身以外数组的乘积
java·leetcode
武子康6 分钟前
大语言模型 09 - 从0开始训练GPT 0.25B参数量 补充知识之数据集 Pretrain SFT RLHF
人工智能·gpt·ai·语言模型·自然语言处理
小李不想说话18 分钟前
HTTPS 加密原理
java·网络·网络协议·学习·安全·http·https
斯密码赛我是美女20 分钟前
ssti刷刷刷
java·服务器·前端
豌豆花下猫40 分钟前
Python 潮流周刊#102:微软裁员 Faster CPython 团队(摘要)
后端·python·ai
zhz52141 小时前
AI数字人融合VR全景:开启未来营销与交互新篇章
人工智能·ai·交互·vr·ai编程·智能体
进击的小白菜1 小时前
Java回溯算法解决非递减子序列问题(LeetCode 491)的深度解析
java·算法·leetcode
众乐乐_20081 小时前
Java 后端给前端传Long值,精度丢失的问题与解决
java·前端·状态模式
北辰浮光1 小时前
[springboot]SSM日期数据转换易见问题
java·spring boot·后端