【ChatGPT】原生JS实现ChatGPT小型Demo

初入前端的小白也可以尝尝鲜

无需科学上网,调用API2D的接口进行连接(也可以换成官方API,均有免费额度)

第一步、注册API2D

https://api2d.com/r/187255

使用GitHub或邮箱进行注册登录

,通过 GitHub 注册的开发者将获得 50 次的免费次数

第二步、复制ForwardKey

第三步、新建一个html文件

此处省略。。。

第四步、将代码复制到新建的html文件中

<html>

<head>
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <title>Chat GPT客服</title>
</head>

<body>
    <div class="rightSide">
        <div class="header">
            <div class="imgText">
                <div class="userimg">
                    <img src="https://image.51uhj.com/wx/676e4ff60ad46337f9b39d8757766bf581b9b89f5927b1bdf4766a456efdd3d3.png"
                        class="cover">
                </div>
                <h4>梯梯助手Chat GPT客服<br><span>在线</span></h4>
            </div>
        </div>
        <!--chatbox-->
        <div id="chatBox" class="chatBox">
            <div class="message frnd_message">
                <p>欢迎使用梯梯助手Chat GPT客服,有什么问题都可以问我。</span><br><span id="time"></span> </p>
            </div>
        </div>

        <!--chat input-->
        <div class="chatbox_input">
            <div class="chatbox_input_div">
                <input id="chatInput" type="text">
                <button id="chatbox_input_send" class="chatbox_input_send">发送</button>
            </div>
        </div>
    </div>
</body>
<script>
    document.getElementById('time').innerHTML = new Date().toLocaleString();

    var defuleValue = ''

    function debounce(fn, delay = 2000) {
        // 是闭包中的
        let timer
        let changeDom = document.getElementById('chatbox_input_send')
        // input事件调用的函数,相当于obj调用函数 this指向Input
        return function () {
            defuleValue = document.getElementById('chatInput').value
            // 这个if 判断不做也没关系,判断了(除第一次非空的情况)也就是执行从第二次开始,在延迟时间内多次触发才会走该判断
            if (timer) {
                clearTimeout(timer)
            } else {
                changeDom.innerHTML = '正在询问'
                changeDom.disabled = true
                document.getElementById('chatInput').value = ""
            }
            // 此时的箭头函数的this 和 arguments 都是从外部函数继承而来
            // 如果用普通函数就要用词法作用域 var that = this var arg = arguments
            timer = setTimeout(() => {
                // 使得传入的回调函数的this 指向Input这个元素对象
                // arguments是该事件的详情,可以获得该函数被调用时的所有参数,是一个event 对象(所有Dom事件都会传event对象进入)
                // 直接使用 fn() 问题也不大
                fn.apply(this, arguments)
                timer = null
            }, delay)
        }
    }
    // 直接使用
    document.getElementById('chatbox_input_send').addEventListener('click', debounce(() => {
        // 可直接使用this.value获得输入框的值; arguments可用于获取具体触发事件的信息
        // console.log(defuleValue)
        this.handleSend(defuleValue)
    }))

    document.getElementById('chatInput').addEventListener('keydown', function (event) {
        if (event.keyCode == "13") {
            document.getElementById('chatbox_input_send').click();
        }
    })

    function handleSend(inputValue) {
        // console.log(1);
        let inputDom = document.getElementById('chatBox');
        if (!inputValue.length) {
            alert('请输入您的问题!');
            document.getElementById('chatbox_input_send').innerHTML = '发送'
            document.getElementById('chatbox_input_send').disabled = false
            defuleValue = ""
            return
        }
        if (inputValue.length > 50) {
            alert('您输入的问题过长!');
            document.getElementById('chatbox_input_send').innerHTML = '发送'
            document.getElementById('chatbox_input_send').disabled = false
            defuleValue = ""
            return
        }
        inputDom.innerHTML = inputDom.innerHTML + '<div class="message my_message"><p>' + inputValue +
            '</span><br><span>' + new Date().toLocaleString() + '</span> </p></div>'
        const params = {
            model: 'gpt-3.5-turbo',
            messages: [{
                role: 'user',
                content: inputValue
            }],
        }
        let xhr = new XMLHttpRequest();
        xhr.open('post', `https://openai.api2d.net/v1/chat/completions`);
        xhr.setRequestHeader('content-type', 'application/json');
        xhr.setRequestHeader('Authorization', 'Bearer 此处写你的fk');
        xhr.send(JSON.stringify(params));
        xhr.onload = function () {
            console.log(JSON.parse(xhr.response));
            let res = JSON.parse(xhr.response)
            inputDom.innerHTML = inputDom.innerHTML +
                '<div class="message frnd_message"><p>' + res.choices[0].message.content + '</span><br><span>' +
                new Date().toLocaleString() +
                '</span> </p></div>'
            document.getElementById('chatbox_input_send').innerHTML = '发送'
            document.getElementById('chatbox_input_send').disabled = false
            defuleValue = ""
        }
    }
</script>

</html>
<style>
    .chatbox_input_div {
        display: flex;
        align-items: center;
        justify-content: space-between;
    }

    .chatbox_input_send {
        width: 80px;
        height: 30px;
    }

    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-family: 'Open Sans', sans-serif;
    }

    body {
        display: flex;
        justify-content: center;
        align-items: center;
        min-height: 100vh;
        background: linear-gradient(#009688 0%, #009688 130px, #d9dbd5 130px, #d9dbd5 100%)
    }


    .rightside {
        background: #e5ddd5;
        width: 100%;
        position: fixed;
        top: 50px;
    }

    .rightside::before {
        content: '';
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background: url(img6-bg.jpg);
        opacity: 0.06;
    }

    .header {
        position: relative;
        width: 100%;
        height: 60px;
        background: #ededed;
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 0 15px;
    }

    .userimg {
        position: relative;
        width: 40px;
        height: 40px;
        overflow: hidden;
        border-radius: 50%;
        cursor: pointer;
    }

    .cover {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        object-fit: cover;
    }

    .imgText {
        position: relative;
        display: flex;
        justify-content: center;
        align-items: center;
    }

    .imgText h4 {
        font-weight: 500;
        line-height: 1.2em;
        margin-left: 15px;
    }

    .imgText h4 span {
        font-size: 0.8em;
        color: #555;
    }

    .chatBox {
        position: relative;
        width: 100%;
        /* height: calc(100%-120px); */
        height: 70vh;
        padding: 50px;
        overflow-y: auto;
    }

    .message {
        position: relative;
        display: flex;
        width: 100%;
        margin: 5px 0;
    }

    .message p {
        position: relative;
        right: 0;
        text-align: right;
        max-width: 65%;
        padding: 12px;
        background: #dcf8c6;
        border-radius: 10px;
        font-size: 0.9em;
    }

    .message p::before {
        content: '';
        position: absolute;
        top: 0;
        right: -12px;
        width: 20px;
        height: 20px;
        background: linear-gradient(135deg, #dcf8c6 0%, #dcf8c6 50%, transparent 50%, transparent);
    }

    .message p span {
        display: block;
        margin-top: 5px;
        font-size: 0.85em;
        opacity: 0.5;
    }

    .my_message {
        justify-content: flex-end;
    }

    .frnd_message {
        justify-content: flex-start;
    }

    .frnd_message p {
        background: #fff;
        text-align: left;
    }

    .message.frnd_message p::before {
        content: '';
        position: absolute;
        top: 0;
        left: -12px;
        width: 20px;
        height: 20px;
        background: linear-gradient(225deg, #fff 0%, #fff 50%, transparent 50%, transparent);
    }

    .chatbox_input {
        position: relative;
        width: 100%;
        /* height: 150px; */
        background: #f0f0f0;
        padding: 15px;
        justify-content: space-between;
        align-items: center;
    }

    .chatbox_input input {
        position: relative;
        width: 90%;

        margin: 0 20px;
        padding: 10px 20px;
        border: none;
        outline: none;
        border-radius: 30px;
        font-size: 1em;
    }
</style>

第五步、将复制的ForwardKey粘贴到这个地方

!!!注意 Bearer与空格不能删除

第六步、双击打开html文件

 这样就可以愉快的聊天了,如果只是想简单的尝试一下话就不用看下面的附录了。

附录

代码实现了按钮与输入框防抖置灰

如果想正式使用的话请将ForwardKey加密,否则会有恶意攻击的风险

如果需要更加深入的功能(如更换训练模型,更换版本)请看API2D官方文档(结一下广告费,本条

                                                                                   

目录

第一步、注册API2D

第二步、复制ForwardKey

第三步、新建一个html文件

第四步、将代码复制到新建的html文件中

第五步、将复制的ForwardKey粘贴到这个地方

第六步、双击打开html文件

附录


RiverGod-致力于每一个还有梦想的前端小白

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以提供一个简单的限时秒杀demo原生JavaScript实现。以下是基本的HTML和CSS代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>限时秒杀</title> <style> .seckill-item { border: 1px solid #ccc; margin: 10px; padding: 10px; width: 200px; height: 200px; float: left; } .seckill-item img { width: 100%; height: 120px; } .seckill-item h3 { font-size: 16px; margin: 10px 0; } .seckill-item .price { font-size: 20px; color: red; margin: 10px 0; } .seckill-item .stock { margin: 10px 0; } .seckill-item .btn-seckill { background-color: #f00; color: #fff; border: none; padding: 5px 10px; margin-top: 10px; cursor: pointer; } </style> </head> <body> <div id="seckill-list"> <div class="seckill-item"> <img src="img/1.jpg" alt="商品1"> <h3>商品1</h3> <div class="price">¥99.00</div> <div class="stock">库存: 100</div> <button class="btn-seckill" data-id="1" data-price="99.00" data-stock="100" data-start="2022/01/01 00:00:00" data-end="2022/01/01 23:59:59">立即秒杀</button> </div> <div class="seckill-item"> <img src="img/2.jpg" alt="商品2"> <h3>商品2</h3> <div class="price">¥199.00</div> <div class="stock">库存: 50</div> <button class="btn-seckill" data-id="2" data-price="199.00" data-stock="50" data-start="2022/01/01 00:00:00" data-end="2022/01/01 23:59:59">立即秒杀</button> </div> </div> <script src="seckill.js"></script> </body> </html> ``` 在这个页面中,我们设置了两个商品的信息,包括商品名称、价格、库存量和秒杀活动的开始时间和结束时间。每个商品都有一个“立即秒杀”按钮,它包含了商品的相关信息,通过data-*属性来存储。 以下是JavaScript代码的实现: ```javascript // 获取秒杀按钮列表 var seckillBtns = document.querySelectorAll('.btn-seckill'); // 循环遍历秒杀按钮列表,为每个按钮添加点击事件 seckillBtns.forEach(function(btn) { btn.addEventListener('click', function() { // 获取秒杀商品的相关信息 var id = this.getAttribute('data-id'); var price = this.getAttribute('data-price'); var stock = this.getAttribute('data-stock'); var start = this.getAttribute('data-start'); var end = this.getAttribute('data-end'); // 判断当前时间是否在秒杀活动时间范围内 var now = new Date(); var startTime = new Date(start); var endTime = new Date(end); if (now < startTime || now > endTime) { alert('秒杀活动还未开始或已经结束!'); return false; } // 判断商品库存是否充足 if (stock <= 0) { alert('商品库存不足!'); return false; } // 发送秒杀请求 alert('恭喜,秒杀成功!'); // 更新商品库存 stock--; this.setAttribute('data-stock', stock); this.parentNode.querySelector('.stock').innerHTML = '库存: ' + stock; }); }); ``` 这段代码的主要功能是为每个“立即秒杀”按钮添加点击事件,当用户点击按钮时,首先获取商品的相关信息,然后判断当前时间是否在秒杀活动时间范围内,以及商品库存是否充足。如果满足条件,就发送秒杀请求,更新商品库存信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值