uniGPT:基于uni-app+vue3+pinia多端AI会话|uniapp仿chatGPT模板

2,995 阅读2分钟

uniappGpt 一款基于uniapp+vite4构建的跨平台chatgpt对话项目。

使用跨端技术uniapp+vue3+pinia架构的一款兼容多端设备仿制chatGPT会话模板案例。支持全端渲染markdown语法及代码高亮、解决软键盘顶起布局。

未标题-1.png

  • 整屏沉浸式顶部导航条/底部tabbar
  • 支持h5+小程序+App端解析markdown语法及代码高亮
  • 采用pinia全局状态管理
  • 基于uview-plus vue3组件库
  • 支持会话本地缓存
  • 解决小程序+App软键盘撑起问题

6320588aa5247a7e1524f5264cca4b0d_1289798-20230626221432232-1433433569.gif

采用了HbuilderX3.8.4开发工具,解决软键盘弹起布局挤压问题,自定义uaNavbar uaTabbar uaInput 组件全面支持h5/小程序/App端。全端支持解析markdown语法

ac4829ce98d6bf18da803f899d032583_1289798-20230626222819758-1299533088.gif

4e6062399269fa1570094d4f7a604ae5_1289798-20230626222834567-1814547999.gif

项目结构

360截图20230625222910722.png

p1.gif

004360截图20230625163854659.png

002360截图20230625163538900.png

004360截图20230625163936890.png

005360截图20230625164331570.png

009360截图20230625164744507.png

011360截图20230625165710635.png

008360截图20230625164648843.png

013360截图20230625170445321.png

013360截图20230625170636546.png

016360截图20230625170901314.png

017360截图20230625170959602.png

018360截图20230625171022150.png

uniapp+vue3搭建项目

uni-app已经能很好的支持vue3 setup编码了,内置了pinia和vuex两种状态管理。

由于之前有过一篇文章专门介绍如何搭建uniapp+vite多端项目,大家可以去看看。

基于uni-app+vite4+pinia构建跨端项目模板

360截图20230625111301103.png

uniapp+vue3自定义导航栏+菜单栏

项目中顶部Navbar 底部Tabbar组件采用自定义组件实现功能。

image.png

支持easycom方式引入组件。

image.png

使用也比较简单,支持自定义标题、颜色及插槽等功能。

<ua-navbar back="false" custom :title="title" size="40rpx" center fixed :bgcolor="bgcolor">
    <template #left>
        <view @click="showSidebar=true"><text class="iconfont ve-icon-menuon"></text></view>
    </template>
    <template #right>
        <text class="iconfont ve-icon-plus fs-36" @click="handleNewChat"></text>
    </template>
</ua-navbar>

目前该两款插件的vue2版本已经发布了插件市场,大家可以去下载使用。 ext.dcloud.net.cn/plugin?id=5…
ext.dcloud.net.cn/plugin?id=5…

001.png

003.png

ua-input增强版输入框已经发布插件市场,免费下载使用。

ext.dcloud.net.cn/plugin?id=1…

main.js入口vue3配置

/**
 * 主入口配置
  */

import App from './App'
import { createSSRApp } from 'vue'

// 引入pinia状态管理
import pinia from '@/store'

// 引入uview-plus组件库
import uviewplus from '@/uview-plus'

export function createApp() {
    const app = createSSRApp(App)
    app.use(pinia)
    app.use(uviewplus)
    return {
        app,
        pinia
    }
}

App.vue

app.vue采用vue3 setup语法,全局获取系统状态条。

<script setup>
    import { provide } from 'vue'
    import { onLaunch, onShow, onHide, onPageNotFound } from '@dcloudio/uni-app'
    
    onLaunch(() => {
        console.log('App Launch')
        
        // 隐藏tabBar
        uni.hideTabBar()
        // 初始化
        initSysInfo()
    })
    
    onShow(() => {
        console.log('App Show')
    })
    
    onHide(() => {
        console.log('App Hide')
    })
    
    onPageNotFound((e) => {
        console.warn('Router Error>>', ` No match path "${e.path}" `);
        uni.redirectTo({
            url: '/pages/404/index'
        })
    })
    
    const initSysInfo = () => {
        uni.getSystemInfo({
            success: (e) => {
                // 获取手机状态栏高度
                let statusBar = e.statusBarHeight
                let customBar
                
                // #ifndef MP
                customBar = statusBar + (e.platform == 'android' ? 50 : 45)
                // #endif
                
                // #ifdef MP-WEIXIN
                // 获取胶囊按钮的布局位置信息
                let menu = wx.getMenuButtonBoundingClientRect()
                // 导航栏高度 = 胶囊下距离 + 胶囊上距离 - 状态栏高度
                customBar = menu.bottom + menu.top - statusBar
                // #endif
                
                // #ifdef MP-ALIPAY
                customBar = statusBar + e.titleBarHeight
                // #endif
                
                // 目前globalData在vue3 setup支持性不好,改为provide/inject方式
                provide('globalData', {
                    statusBarH: statusBar,
                    customBarH: customBar,
                    platform: e.platform
                })
            }
        })
    }
</script>

目前在uniapp在App.vue中使用vue3 setup语法不能很好的支持全局获取globalData数据,可以使用provite+inject进行处理。

uniapp vue3渲染markdown语法

项目中很重要的一个知识点就是uniapp如何渲染markdown语法及代码高亮。并且可以全端h5+小程序+App支持渲染结构。

未标题-3.png

之前也有个一篇专门分享文章,大家可以去看看。

uni-app渲染markdown语法模板

uniapp配置vite.config.js

uni-app支持自定义.env文件及配置vite.config.js。

d977f3b28e8c541dae28e6b15ef4c3d9_1289798-20230627012044557-1301066233.png

import { defineConfig, loadEnv } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import { resolve } from 'path'
import { parseEnv } from './utils/env'

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {
    const viteEnv = loadEnv(mode, __dirname)
    const env = parseEnv(viteEnv)

    return {
        plugins: [
            uni()
        ],
        
        define: {
            // 自定义环境变量
            'process.env.VITE_APPNAME': JSON.stringify('uniapp-chatgpt'),
            'process.env.VITE_ENV': env
        },

        // base: '/',
        // mode: 'development', // Default: 'development' for serve, 'production' for build

        /*构建选项*/
        esbuild: {
            // 打包去除 console.log 和 debugger
            drop: env.VITE_DROP_CONSOLE && command === 'build' ? ["console", "debugger"] : []
        },

        /*开发服务器选项*/
        server: {
            // 端口
            port: env.VITE_PORT,
            // 运行时自动打开浏览器
            open: env.VITE_OPEN,
            // 代理配置
            proxy: {
                // ...
            }
        }
    }
})

OK,以上就是uni-app+vue3开发跨端chatgpt实例的一些分享。

juejin.cn/post/724301…

duitang.gif