├── nuxt ├── public │ ├── sw.js │ └── favicon.ico └── app │ ├── index.d.ts │ ├── pages │ ├── account │ │ ├── index.vue │ │ ├── general.vue │ │ ├── devices.vue │ │ └── log.vue │ ├── auth │ │ ├── login.vue │ │ ├── register.vue │ │ ├── forgot.vue │ │ ├── verify.vue │ │ └── reset │ │ │ └── [token].vue │ ├── index.vue │ ├── account.vue │ ├── price.vue │ ├── workflow.vue │ └── bot.vue │ ├── middleware │ ├── auth.ts │ ├── guest.ts │ ├── role-user.ts │ ├── role-admin.ts │ └── verified.ts │ ├── app.config.ts │ ├── plugins │ ├── arco-design.ts │ ├── fetchSettings.ts │ └── app.ts │ ├── components │ ├── app │ │ ├── Logo.vue │ │ ├── Footer.vue │ │ ├── Theme.vue │ │ ├── Header.vue │ │ └── Signin.vue │ ├── modal │ │ └── User.vue │ ├── home │ │ ├── Welcome.vue │ │ ├── Demo.vue │ │ └── Tetris.vue │ ├── auth │ │ ├── ForgotPassword.vue │ │ ├── Register.vue │ │ └── Login.vue │ ├── account │ │ ├── About.vue │ │ ├── UpdateProfile.vue │ │ └── UpdatePassword.vue │ └── input │ │ └── UploadImage.vue │ ├── assets │ └── css │ │ ├── main.css │ │ ├── arco.css │ │ ├── dark.css │ │ └── style.min.css │ ├── app.vue │ ├── stores │ ├── settings.ts │ └── auth.ts │ └── error.vue ├── tsconfig.json ├── .gitattributes ├── .editorconfig ├── .gitignore ├── .vscode └── settings.json ├── package.json ├── .env.example ├── nuxt.config.ts └── README.md /nuxt/public/sw.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nuxt/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onenov/ChatBot-Next/HEAD/nuxt/public/favicon.ico -------------------------------------------------------------------------------- /nuxt/app/index.d.ts: -------------------------------------------------------------------------------- 1 | declare module '#app' { 2 | interface NuxtApp { 3 | $storage(msg: string): string 4 | } 5 | } 6 | 7 | export { } -------------------------------------------------------------------------------- /nuxt/app/pages/account/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://nuxt.com/docs/guide/concepts/typescript 3 | "extends": "./nuxt/.nuxt/tsconfig.json", 4 | "compilerOptions": { 5 | "module": "ESNext" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.blade.php diff=html 4 | *.css diff=css 5 | *.html diff=html 6 | *.md diff=markdown 7 | *.php diff=php 8 | 9 | /.github export-ignore 10 | CHANGELOG.md export-ignore 11 | .styleci.yml export-ignore 12 | -------------------------------------------------------------------------------- /nuxt/app/middleware/auth.ts: -------------------------------------------------------------------------------- 1 | export default defineNuxtRouteMiddleware((to, from) => { 2 | const nuxtApp = useNuxtApp() 3 | const auth = useAuthStore() 4 | 5 | if (!auth.logged) { 6 | return nuxtApp.runWithContext(() => navigateTo('/')) 7 | } 8 | }) 9 | -------------------------------------------------------------------------------- /nuxt/app/middleware/guest.ts: -------------------------------------------------------------------------------- 1 | export default defineNuxtRouteMiddleware((to, from) => { 2 | const nuxtApp = useNuxtApp() 3 | const auth = useAuthStore() 4 | 5 | if (auth.logged) { 6 | return nuxtApp.runWithContext(() => navigateTo('/')) 7 | } 8 | }) 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{ts,js,vue}] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /nuxt/app/app.config.ts: -------------------------------------------------------------------------------- 1 | export default defineAppConfig({ 2 | ui: { 3 | primary: "emerald", 4 | strategy: "override", 5 | gray: "neutral", 6 | container: { 7 | constrained: "max-w-screen-2xl w-full", 8 | }, 9 | avatar: { 10 | default: { 11 | icon: "i-heroicons-user", 12 | }, 13 | }, 14 | }, 15 | }); 16 | -------------------------------------------------------------------------------- /nuxt/app/plugins/arco-design.ts: -------------------------------------------------------------------------------- 1 | import ArcoVue from "@arco-design/web-vue"; 2 | // 此处引入css则不需要在nuxt.config.ts配置 3 | import "@arco-design/web-vue/dist/arco.css"; 4 | import ArcoVueIcon from '@arco-design/web-vue/es/icon'; 5 | 6 | export default defineNuxtPlugin((nuxtApp) => { 7 | nuxtApp.vueApp.use(ArcoVue); 8 | nuxtApp.vueApp.use(ArcoVueIcon); 9 | 10 | }); 11 | -------------------------------------------------------------------------------- /nuxt/app/pages/auth/login.vue: -------------------------------------------------------------------------------- 1 | 10 | 17 | -------------------------------------------------------------------------------- /nuxt/app/pages/auth/register.vue: -------------------------------------------------------------------------------- 1 | 10 | 17 | -------------------------------------------------------------------------------- /nuxt/app/pages/auth/forgot.vue: -------------------------------------------------------------------------------- 1 | 10 | 17 | -------------------------------------------------------------------------------- /nuxt/app/pages/index.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /nuxt/app/middleware/role-user.ts: -------------------------------------------------------------------------------- 1 | export default defineNuxtRouteMiddleware((to, from) => { 2 | const nuxtApp = useNuxtApp() 3 | const auth = useAuthStore() 4 | 5 | if (auth.logged && !auth.user.roles.includes('user')) { 6 | return nuxtApp.runWithContext(() => { 7 | useToast().add({ 8 | icon: "i-heroicons-exclamation-circle-solid", 9 | title: "Access denied.", 10 | color: "red", 11 | }); 12 | 13 | return navigateTo('/') 14 | }) 15 | } 16 | }) 17 | -------------------------------------------------------------------------------- /nuxt/app/middleware/role-admin.ts: -------------------------------------------------------------------------------- 1 | export default defineNuxtRouteMiddleware((to, from) => { 2 | const nuxtApp = useNuxtApp() 3 | const auth = useAuthStore() 4 | 5 | if (auth.logged && !auth.user.roles.includes('admin')) { 6 | return nuxtApp.runWithContext(() => { 7 | useToast().add({ 8 | icon: "i-heroicons-exclamation-circle-solid", 9 | title: "Access denied.", 10 | color: "red", 11 | }); 12 | 13 | return navigateTo('/') 14 | }) 15 | } 16 | }) 17 | -------------------------------------------------------------------------------- /nuxt/app/middleware/verified.ts: -------------------------------------------------------------------------------- 1 | export default defineNuxtRouteMiddleware((to, from) => { 2 | const nuxtApp = useNuxtApp() 3 | const auth = useAuthStore() 4 | 5 | if (auth.logged && auth.user.must_verify_email) { 6 | return nuxtApp.runWithContext(() => { 7 | useToast().add({ 8 | icon: "i-heroicons-exclamation-circle-solid", 9 | title: "Please confirm your email.", 10 | color: "red", 11 | }); 12 | 13 | return navigateTo('/account/general') 14 | }) 15 | } 16 | }) 17 | -------------------------------------------------------------------------------- /nuxt/app/components/app/Logo.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /nuxt/app/assets/css/main.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | #__nuxt { 7 | @apply min-h-screen flex flex-col; 8 | } 9 | 10 | html { 11 | @apply text-gray-800 dark:bg-gray-900; 12 | } 13 | 14 | html.dark { 15 | @apply text-gray-50 bg-gray-900; 16 | } 17 | 18 | button, 19 | a, 20 | [role="button"] { 21 | @apply transition-colors; 22 | } 23 | 24 | input[type="checkbox"], 25 | input[type="radio"] { 26 | @apply transition-all; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /nuxt/app/app.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 25 | -------------------------------------------------------------------------------- /nuxt/app/components/app/Footer.vue: -------------------------------------------------------------------------------- 1 | 8 | 16 | -------------------------------------------------------------------------------- /nuxt/app/stores/settings.ts: -------------------------------------------------------------------------------- 1 | // nuxt/app/stores/settings.ts 2 | import { defineStore } from "pinia"; 3 | 4 | interface Settings { 5 | Web_Title: string; 6 | Web_Description: string; 7 | Web_URL: string; 8 | Web_Logo: string; 9 | Dify_Api: string; 10 | Dify_Token: string; 11 | } 12 | 13 | export const useSettingsStore = defineStore("settings", { 14 | state: (): { settings: Settings } => ({ 15 | settings: { 16 | Web_Title: "", 17 | Web_Description: "", 18 | Web_URL: "", 19 | Web_Logo: "", 20 | Dify_Api: "", 21 | Dify_Token: "", 22 | }, 23 | }), 24 | actions: { 25 | setSettings(settings: Settings) { 26 | this.settings = settings; 27 | }, 28 | }, 29 | }); 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /public/build 4 | /public/hot 5 | /public/storage 6 | /public/.well-known 7 | /storage/*.key 8 | /vendor 9 | /public/vendor 10 | .env 11 | .env.backup 12 | .env.production 13 | .phpunit.result.cache 14 | Homestead.json 15 | Homestead.yaml 16 | auth.json 17 | npm-debug.log 18 | yarn-error.log 19 | yarn.lock 20 | /.fleet 21 | /.idea 22 | /.vscode/* 23 | !/.vscode/settings.json 24 | .npmrc 25 | 26 | # Nuxt dev/build outputs 27 | /nuxt/.nuxt 28 | /nuxt/.output 29 | .output 30 | .data 31 | .nuxt 32 | .nitro 33 | .cache 34 | dist 35 | 36 | # Node dependencies 37 | node_modules 38 | 39 | # Logs 40 | logs 41 | *.log 42 | 43 | # Misc 44 | .DS_Store 45 | .fleet 46 | .idea 47 | 48 | # Local env files 49 | .env 50 | -------------------------------------------------------------------------------- /nuxt/app/pages/account.vue: -------------------------------------------------------------------------------- 1 | 26 | 32 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "*.css": "tailwindcss" 4 | }, 5 | "editor.quickSuggestions": { 6 | "strings": true 7 | }, 8 | "tailwindCSS.experimental.classRegex": [ 9 | [ 10 | "ui:\\s*{([^)]*)\\s*}", 11 | "[\"'`]([^\"'`]*).*?[\"'`]" 12 | ], 13 | [ 14 | "/\\*ui\\*/\\s*{([^;]*)}", 15 | ":\\s*[\"'`]([^\"'`]*).*?[\"'`]" 16 | ] 17 | ], 18 | "tailwindCSS.classAttributes": [ 19 | "class", 20 | "className", 21 | "ngClass", 22 | "ui" 23 | ], 24 | "typescript.tsdk": "node_modules/typescript/lib", 25 | "vue3snippets.enable-compile-vue-file-on-did-save-code": true, 26 | "intelephense.completion.maxItems": 200, 27 | "editor.formatOnSave": true, 28 | "intelephense.format.enable": true, 29 | } -------------------------------------------------------------------------------- /nuxt/app/components/modal/User.vue: -------------------------------------------------------------------------------- 1 | 5 | 26 | -------------------------------------------------------------------------------- /nuxt/app/error.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 27 | -------------------------------------------------------------------------------- /nuxt/app/components/app/Theme.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 32 | -------------------------------------------------------------------------------- /nuxt/app/components/home/Welcome.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 33 | -------------------------------------------------------------------------------- /nuxt/app/plugins/fetchSettings.ts: -------------------------------------------------------------------------------- 1 | // nuxt/app/plugins/fetchSettings.ts 2 | import { defineNuxtPlugin, useRuntimeConfig } from "#app"; 3 | import { useSettingsStore } from "~/stores/settings"; 4 | 5 | export default defineNuxtPlugin(async (nuxtApp) => { 6 | const settingsStore = useSettingsStore(nuxtApp.$pinia); 7 | const config = useRuntimeConfig(); 8 | 9 | try { 10 | const { data, error } = await useFetch( 11 | `${config.public.apiBase}${config.public.apiPrefix}/get_settings`, 12 | { 13 | method: "POST", 14 | headers: { 15 | "Content-Type": "application/json", 16 | }, 17 | body: JSON.stringify({ 18 | /* 可以在这里添加请求体 */ 19 | }), 20 | } 21 | ); 22 | 23 | if (error.value) { 24 | console.error("Error fetching settings:", error.value); 25 | return; 26 | } 27 | 28 | if (!data.value) { 29 | console.error("Failed to fetch settings: No data returned"); 30 | return; 31 | } 32 | 33 | settingsStore.setSettings(data.value); 34 | // console.log("Settings fetched and stored:", data.value); 35 | } catch (error) { 36 | console.error("Failed to fetch settings:", error); 37 | } 38 | }); 39 | -------------------------------------------------------------------------------- /nuxt/app/pages/auth/verify.vue: -------------------------------------------------------------------------------- 1 | 21 | 40 | -------------------------------------------------------------------------------- /nuxt/app/pages/account/general.vue: -------------------------------------------------------------------------------- 1 | 6 | 39 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel-nuxt", 3 | "private": true, 4 | "type": "module", 5 | "scripts": { 6 | "serve": "node nuxt/.output/server/index.mjs", 7 | "build": "nuxi cleanup && nuxi build", 8 | "cleanup": "nuxi cleanup", 9 | "dev": "nuxt dev", 10 | "generate": "nuxt generate", 11 | "preview": "nuxt preview", 12 | "postinstall": "nuxt prepare", 13 | "api": "php artisan octane:start --watch" 14 | }, 15 | "devDependencies": { 16 | "@arco-design/web-vue": "^2.55.3", 17 | "@iconify-json/heroicons": "^1.1.21", 18 | "@iconify/vue": "^4.1.2", 19 | "@nuxt/devtools": "^1.3.9", 20 | "@nuxt/image": "^1.7.0", 21 | "@nuxt/ui": "^2.17.0", 22 | "@pinia/nuxt": "^0.5.1", 23 | "chokidar": "^3.6.0", 24 | "dayjs-nuxt": "^2.1.9", 25 | "nuxt": "^3.12.3", 26 | "nuxt-security": "^1.4.3", 27 | "vue": "^3.4.31", 28 | "vue-router": "^4.4.0" 29 | }, 30 | "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e", 31 | "dependencies": { 32 | "@nuxt/ui-pro": "^1.3.2", 33 | "axios": "^1.7.2" 34 | } 35 | } -------------------------------------------------------------------------------- /nuxt/app/components/auth/ForgotPassword.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 46 | -------------------------------------------------------------------------------- /nuxt/app/stores/auth.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | 3 | export type User = { 4 | ulid: string; 5 | name: string; 6 | email: string; 7 | avatar: string; 8 | must_verify_email: boolean; 9 | has_password: boolean; 10 | roles: string[]; 11 | providers: string[]; 12 | } 13 | 14 | export const useAuthStore = defineStore('auth', () => { 15 | const config = useRuntimeConfig() 16 | const nuxtApp = useNuxtApp() 17 | 18 | const user = ref({}); 19 | const token = useCookie('token', { 20 | path: '/', 21 | sameSite: 'strict', 22 | secure: config.public.apiBase.startsWith('https://'), 23 | maxAge: 60 * 60 * 24 * 365 24 | }) 25 | const logged = computed(() => !!token.value) 26 | 27 | const { refresh: logout } = useFetch('logout', { 28 | method: 'POST', 29 | immediate: false, 30 | onResponse({ response }) { 31 | if (response.status === 200) { 32 | token.value = '' 33 | user.value = {} 34 | 35 | nuxtApp.runWithContext(() => { 36 | return navigateTo('/'); 37 | }) 38 | } 39 | } 40 | }) 41 | 42 | const { refresh: fetchUser } = useFetch('user', { 43 | immediate: false, 44 | onResponse({ response }) { 45 | if (response.status === 200) { 46 | user.value = response._data.user 47 | } 48 | } 49 | }) 50 | 51 | return { user, logged, logout, fetchUser, token } 52 | }) 53 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=ChatBotNext 2 | APP_ENV=local 3 | APP_KEY=base64:+HevWQcC4/rAz01YPSbbnA== 4 | APP_DEBUG=true 5 | APP_TIMEZONE=Asia/Shanghai 6 | APP_SERVICE=laravelnuxt.api 7 | APP_URL=http://localhost:8000 8 | API_LOCAL_URL=http://localhost:8000 9 | FRONTEND_URL=http://localhost:3000 10 | 11 | OCTANE_HOST=localhost 12 | OCTANE_PORT=8000 13 | HOST=localhost 14 | PORT=3000 15 | 16 | APP_LOCALE=zh_CN 17 | APP_FALLBACK_LOCALE=zh_CN 18 | APP_FAKER_LOCALE=zh_CN 19 | 20 | AUTH_GUARD=api 21 | 22 | APP_MAINTENANCE_DRIVER=file 23 | APP_MAINTENANCE_STORE=database 24 | 25 | BCRYPT_ROUNDS=12 26 | 27 | LOG_CHANNEL=stack 28 | LOG_STACK=single 29 | LOG_DEPRECATIONS_CHANNEL=null 30 | LOG_LEVEL=debug 31 | 32 | DB_CONNECTION=sqlite 33 | # DB_HOST=127.0.0.1 34 | # DB_PORT=3306 35 | # DB_DATABASE=laravel 36 | # DB_USERNAME=root 37 | # DB_PASSWORD= 38 | 39 | SESSION_DRIVER=database 40 | SESSION_LIFETIME=120 41 | SESSION_ENCRYPT=false 42 | SESSION_PATH=/ 43 | SESSION_DOMAIN=null 44 | 45 | BROADCAST_CONNECTION=log 46 | FILESYSTEM_DISK=local 47 | QUEUE_CONNECTION=redis 48 | 49 | CACHE_STORE=redis 50 | CACHE_PREFIX= 51 | 52 | MEMCACHED_HOST=127.0.0.1 53 | 54 | REDIS_CLIENT=phpredis 55 | REDIS_HOST=127.0.0.1 56 | REDIS_PASSWORD=null 57 | REDIS_PORT=6379 58 | 59 | MAIL_MAILER=smtp 60 | MAIL_HOST=smtp.office365.com 61 | MAIL_PORT=587 62 | MAIL_USERNAME=example.office.com 63 | MAIL_PASSWORD=password 64 | MAIL_ENCRYPTION=tls 65 | MAIL_FROM_ADDRESS="example.office.com" 66 | MAIL_FROM_NAME="${APP_NAME}" 67 | 68 | AWS_ACCESS_KEY_ID= 69 | AWS_SECRET_ACCESS_KEY= 70 | AWS_DEFAULT_REGION=us-east-1 71 | AWS_BUCKET= 72 | AWS_USE_PATH_STYLE_ENDPOINT=false 73 | 74 | VITE_APP_NAME="${APP_NAME}" 75 | 76 | GOOGLE_CLIENT_ID= 77 | GOOGLE_CLIENT_SECRET= 78 | GOOGLE_REDIRECT_URI=http://localhost:8000/api/v1/login/google/callback 79 | 80 | TELESCOPE_ENABLED=false 81 | -------------------------------------------------------------------------------- /nuxt/app/components/account/About.vue: -------------------------------------------------------------------------------- 1 | 26 | 59 | -------------------------------------------------------------------------------- /nuxt/app/pages/account/devices.vue: -------------------------------------------------------------------------------- 1 | 50 | 74 | -------------------------------------------------------------------------------- /nuxt/app/pages/account/log.vue: -------------------------------------------------------------------------------- 1 | 52 | 53 | 66 | -------------------------------------------------------------------------------- /nuxt/app/components/auth/Register.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 71 | -------------------------------------------------------------------------------- /nuxt/app/components/home/Demo.vue: -------------------------------------------------------------------------------- 1 | 45 | -------------------------------------------------------------------------------- /nuxt/app/pages/auth/reset/[token].vue: -------------------------------------------------------------------------------- 1 | 43 | 74 | -------------------------------------------------------------------------------- /nuxt/app/assets/css/arco.css: -------------------------------------------------------------------------------- 1 | --color-white: rgba(255, 255, 255, 0.9) !important; 2 | --color-black: #000000 !important; 3 | --color-border: #333335 !important; 4 | --color-bg-1: #17171a !important; 5 | --color-bg-2: #232324 !important; 6 | --color-bg-3: #2a2a2b !important; 7 | --color-bg-4: #313132 !important; 8 | --color-bg-5: #373739 !important; 9 | --color-bg-white: #f6f6f6 !important; 10 | --color-text-1: rgba(255, 255, 255, 0.9) !important; 11 | --color-text-2: rgba(255, 255, 255, 0.7) !important; 12 | --color-text-3: rgba(255, 255, 255, 0.5) !important; 13 | --color-text-4: rgba(255, 255, 255, 0.3) !important; 14 | --color-fill-1: rgba(255, 255, 255, 0.04) !important; 15 | --color-fill-2: rgba(255, 255, 255, 0.08) !important; 16 | --color-fill-3: rgba(255, 255, 255, 0.12) !important; 17 | --color-fill-4: rgba(255, 255, 255, 0.16) !important; 18 | --color-primary-light-1: rgba(var(--primary-6), 0.2) !important; 19 | --color-primary-light-2: rgba(var(--primary-6), 0.35) !important; 20 | --color-primary-light-3: rgba(var(--primary-6), 0.5) !important; 21 | --color-primary-light-4: rgba(var(--primary-6), 0.65) !important; 22 | --color-secondary: rgba(var(--gray-9), 0.08) !important; 23 | --color-secondary-hover: rgba(var(--gray-8), 0.16) !important; 24 | --color-secondary-active: rgba(var(--gray-7), 0.24) !important; 25 | --color-secondary-disabled: rgba(var(--gray-9), 0.08) !important; 26 | --color-danger-light-1: rgba(var(--danger-6), 0.2) !important; 27 | --color-danger-light-2: rgba(var(--danger-6), 0.35) !important; 28 | --color-danger-light-3: rgba(var(--danger-6), 0.5) !important; 29 | --color-danger-light-4: rgba(var(--danger-6), 0.65) !important; 30 | --color-success-light-1: rgb(var(--success-6), 0.2) !important; 31 | --color-success-light-2: rgb(var(--success-6), 0.35) !important; 32 | --color-success-light-3: rgb(var(--success-6), 0.5) !important; 33 | --color-success-light-4: rgb(var(--success-6), 0.65) !important; 34 | --color-warning-light-1: rgb(var(--warning-6), 0.2) !important; 35 | --color-warning-light-2: rgb(var(--warning-6), 0.35) !important; 36 | --color-warning-light-3: rgb(var(--warning-6), 0.5) !important; 37 | --color-warning-light-4: rgb(var(--warning-6), 0.65) !important; 38 | --color-link-light-1: rgb(var(--link-6), 0.2) !important; 39 | --color-link-light-2: rgb(var(--link-6), 0.35) !important; 40 | --color-link-light-3: rgb(var(--link-6), 0.5) !important; 41 | --color-link-light-4: rgb(var(--link-6), 0.65) !important; 42 | --color-tooltip-bg: #373739 !important; 43 | --color-spin-layer-bg: rgba(51, 51, 51, 0.6) !important; 44 | --color-menu-dark-bg: #232324 !important; 45 | --color-menu-light-bg: #232324 !important; 46 | --color-menu-dark-hover: var(--color-fill-2) !important; 47 | --color-mask-bg: rgba(23, 23, 26, 0.6) !important; 48 | -------------------------------------------------------------------------------- /nuxt/app/components/account/UpdateProfile.vue: -------------------------------------------------------------------------------- 1 | 53 | 54 | 85 | -------------------------------------------------------------------------------- /nuxt/app/components/input/UploadImage.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | 83 | -------------------------------------------------------------------------------- /nuxt/app/components/account/UpdatePassword.vue: -------------------------------------------------------------------------------- 1 | 49 | 50 | 83 | -------------------------------------------------------------------------------- /nuxt/app/components/home/Tetris.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 84 | 85 | 96 | -------------------------------------------------------------------------------- /nuxt.config.ts: -------------------------------------------------------------------------------- 1 | // https://nuxt.com/docs/api/configuration/nuxt-config 2 | export default defineNuxtConfig({ 3 | compatibilityDate: "2024-07-03", 4 | rootDir: "nuxt/", 5 | 6 | future: { 7 | compatibilityVersion: 4, 8 | }, 9 | 10 | /** 11 | * Manually disable nuxt telemetry. 12 | * @see [Nuxt Telemetry](https://github.com/nuxt/telemetry) for more information. 13 | */ 14 | telemetry: true, 15 | ssr: false, 16 | $development: { 17 | ssr: false, 18 | devtools: { 19 | enabled: false, 20 | }, 21 | }, 22 | 23 | $production: { 24 | ssr: false, 25 | }, 26 | 27 | app: { 28 | head: { 29 | title: "Home", 30 | titleTemplate: "%s | ChatBotNext", 31 | meta: [ 32 | { charset: "utf-8" }, 33 | { name: "viewport", content: "width=device-width, initial-scale=1" }, 34 | ], 35 | link: [{ rel: "icon", type: "image/x-icon", href: "/favicon.ico" }], 36 | }, 37 | }, 38 | 39 | routeRules: { 40 | "auth/verify": { ssr: false }, 41 | }, 42 | 43 | tailwindcss: { 44 | cssPath: "@/assets/css/main.css", 45 | }, 46 | css: ["@/assets/css/style.min.css", "@/assets/css/dark.css"], 47 | /** 48 | * @see https://v3.nuxtjs.org/api/configuration/nuxt.config#modules 49 | */ 50 | extends: ["@nuxt/ui-pro"], 51 | modules: [ 52 | "@nuxt/ui", 53 | "@nuxt/image", 54 | "@pinia/nuxt", 55 | "dayjs-nuxt", 56 | "nuxt-security", 57 | "@nuxtjs/tailwindcss", 58 | ], 59 | 60 | ui: { 61 | icons: ["heroicons"], 62 | }, 63 | 64 | image: { 65 | domains: [import.meta.env.APP_URL || "http://127.0.0.1:8000"], 66 | alias: { 67 | api: import.meta.env.APP_URL || "http://127.0.0.1:8000", 68 | }, 69 | }, 70 | 71 | security: { 72 | headers: { 73 | crossOriginEmbedderPolicy: "unsafe-none", 74 | crossOriginOpenerPolicy: "same-origin-allow-popups", 75 | contentSecurityPolicy: { 76 | "img-src": [ 77 | "'self'", 78 | "data:", 79 | "https://*", 80 | import.meta.env.APP_URL || "http://127.0.0.1:8000", 81 | ], 82 | }, 83 | }, 84 | }, 85 | 86 | dayjs: { 87 | locales: ["en", "zh-cn"], // 添加中文支持 88 | plugins: ["relativeTime", "utc", "timezone"], 89 | defaultLocale: "zh-cn", // 设置默认语言为中文 90 | defaultTimezone: "Asia/Shanghai", // 设置默认时区为上海 91 | }, 92 | plugins: ["~/plugins/fetchSettings.ts"], 93 | typescript: { 94 | strict: false, 95 | }, 96 | 97 | /** 98 | * @see https://v3.nuxtjs.org/guide/features/runtime-config#exposing-runtime-config 99 | */ 100 | runtimeConfig: { 101 | apiLocal: import.meta.env.API_LOCAL_URL, 102 | public: { 103 | apiBase: import.meta.env.APP_URL, 104 | apiPrefix: "/api/v1", 105 | storageBase: import.meta.env.APP_URL + "/storage/", 106 | providers: { 107 | google: { 108 | name: "Google", 109 | icon: "", 110 | color: "gray", 111 | }, 112 | }, 113 | }, 114 | }, 115 | build: { 116 | chunkSizeWarningLimit: 1000, // 单位为 KB 117 | analyze: true, // 这将打开包分析器 118 | }, 119 | nitro: { 120 | prerender: { 121 | crawlLinks: true, 122 | routes: ["/workflow"], // 添加需 prerender 的路径 123 | }, 124 | }, 125 | }); 126 | -------------------------------------------------------------------------------- /nuxt/app/components/app/Header.vue: -------------------------------------------------------------------------------- 1 | 75 | 127 | -------------------------------------------------------------------------------- /nuxt/app/plugins/app.ts: -------------------------------------------------------------------------------- 1 | import type { FetchOptions } from "ofetch"; 2 | import { ofetch } from "ofetch"; 3 | 4 | export default defineNuxtPlugin({ 5 | name: "app", 6 | enforce: "default", 7 | parallel: true, 8 | async setup(nuxtApp) { 9 | const config = useRuntimeConfig(); 10 | const auth = useAuthStore(); 11 | 12 | nuxtApp.provide("storage", (path: string): string => { 13 | if (!path) return ""; 14 | 15 | return path.startsWith("http://") || path.startsWith("https://") 16 | ? path 17 | : config.public.storageBase + path; 18 | }); 19 | 20 | function buildHeaders(headers = {}): HeadersInit { 21 | return { 22 | ...headers, 23 | ...{ 24 | Accept: "application/json", 25 | }, 26 | ...(import.meta.server 27 | ? { 28 | referer: useRequestURL().toString(), 29 | ...useRequestHeaders([ 30 | "x-forwarded-for", 31 | "user-agent", 32 | "referer", 33 | ]), 34 | } 35 | : {}), 36 | ...(auth.logged 37 | ? { 38 | Authorization: `Bearer ${auth.token}`, 39 | } 40 | : {}), 41 | }; 42 | } 43 | 44 | function buildBaseURL(baseURL: string): string { 45 | if (baseURL) return baseURL; 46 | 47 | return import.meta.server 48 | ? config.apiLocal + config.public.apiPrefix 49 | : config.public.apiBase + config.public.apiPrefix; 50 | } 51 | 52 | function buildSecureMethod(options: FetchOptions): void { 53 | if (import.meta.server) return; 54 | 55 | const method = options.method?.toLowerCase() ?? "get"; 56 | 57 | if (options.body instanceof FormData && method === "put") { 58 | options.method = "POST"; 59 | options.body.append("_method", "PUT"); 60 | } 61 | } 62 | 63 | function isRequestWithAuth(baseURL: string, path: string): boolean { 64 | return ( 65 | !baseURL && 66 | !path.startsWith("/_nuxt") && 67 | !path.startsWith("http://") && 68 | !path.startsWith("https://") 69 | ); 70 | } 71 | 72 | globalThis.$fetch = ofetch.create({ 73 | retry: false, 74 | 75 | onRequest({ request, options }) { 76 | if (!isRequestWithAuth(options.baseURL ?? "", request.toString())) 77 | return; 78 | 79 | options.credentials = "include"; 80 | 81 | options.baseURL = buildBaseURL(options.baseURL ?? ""); 82 | options.headers = buildHeaders(options.headers); 83 | 84 | buildSecureMethod(options); 85 | }, 86 | 87 | onRequestError({ error }) { 88 | if (import.meta.server) return; 89 | 90 | if (error.name === "AbortError") return; 91 | 92 | useToast().add({ 93 | icon: "i-heroicons-exclamation-circle-solid", 94 | color: "red", 95 | title: error.message ?? "Something went wrong", 96 | }); 97 | }, 98 | 99 | onResponseError({ response }) { 100 | if (response.status === 401) { 101 | if (auth.logged) { 102 | auth.token = ""; 103 | auth.user = {}; 104 | } 105 | 106 | if (import.meta.client) { 107 | useToast().add({ 108 | title: "请先登录", 109 | icon: "i-heroicons-exclamation-circle-solid", 110 | color: "primary", 111 | }); 112 | } 113 | } else if (response.status !== 422) { 114 | if (import.meta.client) { 115 | useToast().add({ 116 | icon: "i-heroicons-exclamation-circle-solid", 117 | color: "red", 118 | title: 119 | response._data?.message ?? 120 | response.statusText ?? 121 | "Something went wrong", 122 | }); 123 | } 124 | } 125 | }, 126 | }); 127 | 128 | if (auth.logged) { 129 | await auth.fetchUser(); 130 | } 131 | }, 132 | }); 133 | -------------------------------------------------------------------------------- /nuxt/app/components/auth/Login.vue: -------------------------------------------------------------------------------- 1 | 82 | 83 | 120 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://io.onenov.cn/file/202407151458648.png) 2 | 3 | # ChatBot Next 4 | 5 | [![](https://img.shields.io/badge/Laravel-v11-ff2e21.svg)](https://laravel.com) 6 | [![](https://img.shields.io/badge/nuxt.js-v3-04C690.svg)](https://nuxt.com) 7 | 8 | 无缝集成处理和调度 Dify & Dify on WeChat,Web 可视化多用户管理/一键启动 ChatBot,简化了令人惊叹且响应迅速的 ChatBot 应用程序的创建。 9 | 10 | 请注意:该项目仅用于学习交流使用,Dify 允许被用于商业化,例如作为其他应用的“后端即服务”使用,或者作为应用开发平台提供给企业。然而,当满足以下条件时,必须联系生产者获得商业许可: 11 | - 多租户 SaaS 服务:除非获得 Dify 的明确书面授权,否则不得使用 Dify.AI 的源码来运营与 Dify.AI 服务版类似的多租户 SaaS 服务。 12 | - LOGO 及版权信息:在使用 Dify 的过程中,不得移除或修改 Dify 控制台内的 LOGO 或版权信息。 13 | 14 | ## 演示 15 | 16 | - [ChatBot Next](https://chatbot-dev.orence.net) 17 | 18 | ## 要求 19 | 20 | - PHP 8.2 / Node 20+ 21 | - [**Throttling with Redis**](https://laravel.com/docs/11.x/routing#throttling-with-redis) **Redis** 22 | - [**Laravel Octane**](https://laravel.com/docs/11.x/octane) 支持 2 种运行模式:Swoole(php 扩展)或 Roadrunner 23 | 24 | ## 说明 25 | 26 | 仅作为一个框架处理和调度 [**Dify**](https://github.com/langgenius/dify) 和 [**Dify on WeChat**](https://github.com/hanfangyuan4396/dify-on-wechat) 项目,并增加了一堆附加功能,目前只开源前端部分。项目还在处于内部开发阶段,你需要根据文档调整其他项目(Dify 、Dify on WeChat)的部署方式。 27 | 28 | 获取方式:请添加微信 [AOKIEO] 了解获取后端,交流或更多。 29 | 30 | ### 目前已经实现的功能 31 | 32 | #### 用户系统 33 | 34 | - 用户注册、登陆、找回密码、邮箱验证 35 | - 用户管理 36 | - 会员管理 37 | - 卡密兑换 38 | - 签到 39 | - 消耗记录 40 | 41 | #### 工作台 42 | 43 | - 应用广场(后台新增开放应用或一些文档) 44 | - 我创建的(联通 Dify 创建不同类型的应用) 45 | - 应用模板(获取 Dify 创建的部分应用作为可复制模板) 46 | - 知识库 47 | - 自动计算工作台创建的应用消耗的额度,与系统余额关联 48 | 49 | #### 助手 50 | 51 | - 一键创建或启动 Dify on WeChat 的机器人 52 | - 通过表单弹窗创建 53 | - 获取日志 54 | - 个人微信二维码扫码登陆流程 55 | - 修改配置 56 | - 启动、停止、删除 57 | 58 | 支持一键启动下面的应用类型 59 | 60 | - 个人微信 61 | - 企业微信应用 62 | - 企业服务公众号 63 | - 个人订阅公众号 64 | - 企业微信客服 65 | - 飞书 66 | 67 | --- 68 | 69 | 支持联通 Dify 的应用类型 70 | 71 | - chatbot(对应聊天助手) 72 | - agent(对应 Agent) 73 | - workflow(对应工作流) 74 | 75 | ## 待开发的功能 76 | 77 | - [ ] 签到自定义延长会员有效期或增加余额 78 | - [ ] 支持 coze 机器人 79 | - [ ] 创建应用增加更多可视化部署 80 | - [ ] 数据清洗模块 81 | 82 | ## Links 83 | 84 | - [Nuxt 3](https://nuxt.com/) 85 | - [Nuxt UI](https://ui.nuxt.com/) 86 | - [Nuxt UI Pro](https://ui.nuxt.com/pro/getting-started) 87 | - [Arco Design VUE](https://arco.design/vue/docs/start) 88 | - [Tailwind CSS](https://tailwindcss.com/) 89 | - [Laravel 11x](https://laravel.com/docs/11.x) 90 | 91 | ## Framework Features 92 | 93 | - [**Laravel 11**](https://laravel.com/docs/11.x) and [**Nuxt 3**](https://nuxt.com/) 94 | - [**Laravel Octane**](https://laravel.com/docs/11.x/octane) supercharges your application's performance by serving your application using high-powered application servers. 95 | - [**Laravel Telescope**](https://laravel.com/docs/11.x/telescope) provides insight into the requests coming into your application, exceptions, log entries, database queries, queued jobs, mail, notifications, cache operations, scheduled tasks, variable dumps, and more. 96 | - [**Laravel Sanctum**](https://laravel.com/docs/11.x/sanctum) Token-based authorization is compatible with **SSR** and **CSR** 97 | - [**Laravel Socialite**](https://laravel.com/docs/11.x/socialite) OAuth providers 98 | - [**Laravel Sail**](https://laravel.com/docs/11.x/sail) Light-weight command-line interface for interacting with Laravel's default Docker development environment. 99 | - [**Spatie Laravel Permissions**](https://spatie.be/docs/laravel-permission/v6/introduction) This package allows you to manage user permissions and roles in a database. 100 | - UI library [**Nuxt UI**](https://ui.nuxt.com/) based on [**TailwindCSS**](https://tailwindui.com/) and [**HeadlessUI**](https://headlessui.com/). 101 | - [**Pinia**](https://pinia.vuejs.org/ssr/nuxt.html) The intuitive store for Vue.js 102 | - Integrated pages: login, registration, password recovery, email confirmation, account information update, password change. 103 | - Temporary uploads with cropping and optimization of images. 104 | - Device management 105 | - [**ofetch**](https://github.com/unjs/ofetch) preset for working with Laravel API, which makes it possible 106 | use $**fetch** without having to resort to custom $**fetch** wrappers. 107 | 108 | ### Authentication 109 | 110 | **useAuthStore()** has everything you need to work with authorization. 111 | 112 | Data returned by **useAuthStore**: 113 | 114 | - `logged`: Boolean, whether the user is authorized 115 | - `token`: Cookie, sanctum token 116 | - `user`: User object, user stored in pinia store 117 | - `logout`: Function, remove local data and call API to remove token 118 | - `fetchUser`: Function, fetch user data 119 | 120 | ### Nuxt Middleware 121 | 122 | The following middleware is supported: 123 | 124 | - `guest`: unauthorized users 125 | - `auth`: authorized users 126 | - `verified`: users who have confirmed their email 127 | - `role-user`: users with the 'user' role 128 | - `role-admin`: users with the 'admin' role 129 | 130 | ### Laravel Middleware 131 | 132 | All built-in middleware from Laravel + middleware based on roles [**Spatie Laravel Permissions Middleware**](https://spatie.be/docs/laravel-permission/v6/basic-usage/middleware) 133 | -------------------------------------------------------------------------------- /nuxt/app/components/app/Signin.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 209 | -------------------------------------------------------------------------------- /nuxt/app/pages/price.vue: -------------------------------------------------------------------------------- 1 | 56 | 192 | -------------------------------------------------------------------------------- /nuxt/app/assets/css/dark.css: -------------------------------------------------------------------------------- 1 | .dark body { 2 | --color-white: rgba(255, 255, 255, 0.9) !important; 3 | --color-black: #000000 !important; 4 | --color-border: #333335 !important; 5 | --color-bg-1: #17171a !important; 6 | --color-bg-2: #232324 !important; 7 | --color-bg-3: #2a2a2b !important; 8 | --color-bg-4: #313132 !important; 9 | --color-bg-5: #373739 !important; 10 | --color-bg-white: #f6f6f6 !important; 11 | --color-text-1: rgba(255, 255, 255, 0.9) !important; 12 | --color-text-2: rgba(255, 255, 255, 0.7) !important; 13 | --color-text-3: rgba(255, 255, 255, 0.5) !important; 14 | --color-text-4: rgba(255, 255, 255, 0.3) !important; 15 | --color-fill-1: rgba(255, 255, 255, 0.04) !important; 16 | --color-fill-2: rgba(255, 255, 255, 0.08) !important; 17 | --color-fill-3: rgba(255, 255, 255, 0.12) !important; 18 | --color-fill-4: rgba(255, 255, 255, 0.16) !important; 19 | --color-primary-light-1: rgba(var(--primary-6), 0.2) !important; 20 | --color-primary-light-2: rgba(var(--primary-6), 0.35) !important; 21 | --color-primary-light-3: rgba(var(--primary-6), 0.5) !important; 22 | --color-primary-light-4: rgba(var(--primary-6), 0.65) !important; 23 | --color-secondary: rgba(var(--gray-9), 0.08) !important; 24 | --color-secondary-hover: rgba(var(--gray-8), 0.16) !important; 25 | --color-secondary-active: rgba(var(--gray-7), 0.24) !important; 26 | --color-secondary-disabled: rgba(var(--gray-9), 0.08) !important; 27 | --color-danger-light-1: rgba(var(--danger-6), 0.2) !important; 28 | --color-danger-light-2: rgba(var(--danger-6), 0.35) !important; 29 | --color-danger-light-3: rgba(var(--danger-6), 0.5) !important; 30 | --color-danger-light-4: rgba(var(--danger-6), 0.65) !important; 31 | --color-success-light-1: rgb(var(--success-6), 0.2) !important; 32 | --color-success-light-2: rgb(var(--success-6), 0.35) !important; 33 | --color-success-light-3: rgb(var(--success-6), 0.5) !important; 34 | --color-success-light-4: rgb(var(--success-6), 0.65) !important; 35 | --color-warning-light-1: rgb(var(--warning-6), 0.2) !important; 36 | --color-warning-light-2: rgb(var(--warning-6), 0.35) !important; 37 | --color-warning-light-3: rgb(var(--warning-6), 0.5) !important; 38 | --color-warning-light-4: rgb(var(--warning-6), 0.65) !important; 39 | --color-link-light-1: rgb(var(--link-6), 0.2) !important; 40 | --color-link-light-2: rgb(var(--link-6), 0.35) !important; 41 | --color-link-light-3: rgb(var(--link-6), 0.5) !important; 42 | --color-link-light-4: rgb(var(--link-6), 0.65) !important; 43 | --color-tooltip-bg: #373739 !important; 44 | --color-spin-layer-bg: rgba(51, 51, 51, 0.6) !important; 45 | --color-menu-dark-bg: #232324 !important; 46 | --color-menu-light-bg: #232324 !important; 47 | --color-menu-dark-hover: var(--color-fill-2) !important; 48 | --color-mask-bg: rgba(23, 23, 26, 0.6) !important; 49 | --red-1: 77, 0, 10 !important; 50 | --red-2: 119, 6, 17 !important; 51 | --red-3: 161, 22, 31 !important; 52 | --red-4: 203, 46, 52 !important; 53 | --red-5: 245, 78, 78 !important; 54 | --red-6: 247, 105, 101 !important; 55 | --red-7: 249, 141, 134 !important; 56 | --red-8: 251, 176, 167 !important; 57 | --red-9: 253, 209, 202 !important; 58 | --red-10: 255, 240, 236 !important; 59 | --orangered-1: 77, 14, 0 !important; 60 | --orangered-2: 119, 30, 5 !important; 61 | --orangered-3: 162, 55, 20 !important; 62 | --orangered-4: 204, 87, 41 !important; 63 | --orangered-5: 247, 126, 69 !important; 64 | --orangered-6: 249, 146, 90 !important; 65 | --orangered-7: 250, 173, 125 !important; 66 | --orangered-8: 252, 198, 161 !important; 67 | --orangered-9: 253, 222, 197 !important; 68 | --orangered-10: 255, 244, 235 !important; 69 | --orange-1: 77, 27, 0 !important; 70 | --orange-2: 121, 48, 4 !important; 71 | --orange-3: 166, 75, 10 !important; 72 | --orange-4: 210, 105, 19 !important; 73 | --orange-5: 255, 141, 31 !important; 74 | --orange-6: 255, 150, 38 !important; 75 | --orange-7: 255, 179, 87 !important; 76 | --orange-8: 255, 205, 135 !important; 77 | --orange-9: 255, 227, 184 !important; 78 | --orange-10: 255, 247, 232 !important; 79 | --gold-1: 77, 45, 0 !important; 80 | --gold-2: 119, 75, 4 !important; 81 | --gold-3: 162, 111, 15 !important; 82 | --gold-4: 204, 150, 31 !important; 83 | --gold-5: 247, 192, 52 !important; 84 | --gold-6: 249, 204, 68 !important; 85 | --gold-7: 250, 220, 108 !important; 86 | --gold-8: 252, 233, 149 !important; 87 | --gold-9: 253, 244, 190 !important; 88 | --gold-10: 255, 252, 232 !important; 89 | --yellow-1: 77, 56, 0 !important; 90 | --yellow-2: 120, 94, 7 !important; 91 | --yellow-3: 163, 134, 20 !important; 92 | --yellow-4: 207, 179, 37 !important; 93 | --yellow-5: 250, 225, 60 !important; 94 | --yellow-6: 251, 233, 75 !important; 95 | --yellow-7: 252, 243, 116 !important; 96 | --yellow-8: 253, 250, 157 !important; 97 | --yellow-9: 254, 254, 198 !important; 98 | --yellow-10: 254, 255, 240 !important; 99 | --lime-1: 42, 77, 0 !important; 100 | --lime-2: 68, 112, 6 !important; 101 | --lime-3: 98, 148, 18 !important; 102 | --lime-4: 132, 183, 35 !important; 103 | --lime-5: 168, 219, 57 !important; 104 | --lime-6: 184, 226, 75 !important; 105 | --lime-7: 203, 233, 112 !important; 106 | --lime-8: 222, 241, 152 !important; 107 | --lime-9: 238, 248, 194 !important; 108 | --lime-10: 253, 255, 238 !important; 109 | --green-1: 0, 77, 28 !important; 110 | --green-2: 4, 102, 37 !important; 111 | --green-3: 10, 128, 45 !important; 112 | --green-4: 18, 154, 55 !important; 113 | --green-5: 29, 180, 64 !important; 114 | --green-6: 39, 195, 70 !important; 115 | --green-7: 80, 210, 102 !important; 116 | --green-8: 126, 225, 139 !important; 117 | --green-9: 178, 240, 183 !important; 118 | --green-10: 235, 255, 236 !important; 119 | --cyan-1: 0, 66, 77 !important; 120 | --cyan-2: 6, 97, 108 !important; 121 | --cyan-3: 17, 131, 139 !important; 122 | --cyan-4: 31, 166, 170 !important; 123 | --cyan-5: 48, 201, 201 !important; 124 | --cyan-6: 63, 212, 207 !important; 125 | --cyan-7: 102, 223, 215 !important; 126 | --cyan-8: 144, 233, 225 !important; 127 | --cyan-9: 190, 244, 237 !important; 128 | --cyan-10: 240, 255, 252 !important; 129 | --blue-1: 0, 26, 77 !important; 130 | --blue-2: 5, 47, 120 !important; 131 | --blue-3: 19, 76, 163 !important; 132 | --blue-4: 41, 113, 207 !important; 133 | --blue-5: 70, 154, 250 !important; 134 | --blue-6: 90, 170, 251 !important; 135 | --blue-7: 125, 193, 252 !important; 136 | --blue-8: 161, 213, 253 !important; 137 | --blue-9: 198, 232, 254 !important; 138 | --blue-10: 234, 248, 255 !important; 139 | --arcoblue-1: 0, 13, 77 !important; 140 | --arcoblue-2: 4, 27, 121 !important; 141 | --arcoblue-3: 14, 50, 166 !important; 142 | --arcoblue-4: 29, 77, 210 !important; 143 | --arcoblue-5: 48, 111, 255 !important; 144 | --arcoblue-6: 60, 126, 255 !important; 145 | --arcoblue-7: 104, 159, 255 !important; 146 | --arcoblue-8: 147, 190, 255 !important; 147 | --arcoblue-9: 190, 218, 255 !important; 148 | --arcoblue-10: 234, 244, 255 !important; 149 | --purple-1: 22, 0, 77 !important; 150 | --purple-2: 39, 6, 110 !important; 151 | --purple-3: 62, 19, 143 !important; 152 | --purple-4: 90, 37, 176 !important; 153 | --purple-5: 123, 61, 209 !important; 154 | --purple-6: 142, 81, 218 !important; 155 | --purple-7: 169, 116, 227 !important; 156 | --purple-8: 197, 154, 237 !important; 157 | --purple-9: 223, 194, 246 !important; 158 | --purple-10: 247, 237, 255 !important; 159 | --pinkpurple-1: 66, 0, 77 !important; 160 | --pinkpurple-2: 101, 3, 112 !important; 161 | --pinkpurple-3: 138, 13, 147 !important; 162 | --pinkpurple-4: 176, 27, 182 !important; 163 | --pinkpurple-5: 217, 46, 217 !important; 164 | --pinkpurple-6: 225, 61, 219 !important; 165 | --pinkpurple-7: 232, 102, 223 !important; 166 | --pinkpurple-8: 240, 146, 230 !important; 167 | --pinkpurple-9: 247, 193, 240 !important; 168 | --pinkpurple-10: 255, 242, 253 !important; 169 | --magenta-1: 77, 0, 52 !important; 170 | --magenta-2: 119, 8, 80 !important; 171 | --magenta-3: 161, 23, 108 !important; 172 | --magenta-4: 203, 43, 136 !important; 173 | --magenta-5: 245, 69, 166 !important; 174 | --magenta-6: 247, 86, 169 !important; 175 | --magenta-7: 249, 122, 184 !important; 176 | --magenta-8: 251, 158, 200 !important; 177 | --magenta-9: 253, 195, 219 !important; 178 | --magenta-10: 255, 232, 241 !important; 179 | --gray-1: 23, 23, 26 !important; 180 | --gray-2: 46, 46, 48 !important; 181 | --gray-3: 72, 72, 73 !important; 182 | --gray-4: 95, 95, 96 !important; 183 | --gray-5: 120, 120, 122 !important; 184 | --gray-6: 146, 146, 147 !important; 185 | --gray-7: 171, 171, 172 !important; 186 | --gray-8: 197, 197, 197 !important; 187 | --gray-9: 223, 223, 223 !important; 188 | --gray-10: 246, 246, 246 !important; 189 | --primary-1: 232, 255, 244 !important; 190 | --primary-2: 187, 243, 219 !important; 191 | --primary-3: 145, 231, 196 !important; 192 | --primary-4: 106, 219, 178 !important; 193 | --primary-5: 71, 207, 162 !important; 194 | --primary-6: 9, 189, 127 !important; 195 | --primary-7: 25, 165, 128 !important; 196 | --primary-8: 14, 136, 107 !important; 197 | --primary-9: 5, 106, 86 !important; 198 | --primary-10: 0, 77, 64 !important; 199 | --link-1: 0, 14, 77 !important; 200 | --link-2: 13, 30, 95 !important; 201 | --link-3: 32, 52, 113 !important; 202 | --link-4: 57, 78, 131 !important; 203 | --link-5: 87, 107, 149 !important; 204 | --link-6: 125, 141, 170 !important; 205 | --link-7: 150, 166, 191 !important; 206 | --link-8: 178, 192, 213 !important; 207 | --link-9: 207, 219, 234 !important; 208 | --link-10: 238, 246, 255 !important; 209 | --success-1: var(--green-1) !important; 210 | --success-2: var(--green-2) !important; 211 | --success-3: var(--green-3) !important; 212 | --success-4: var(--green-4) !important; 213 | --success-5: var(--green-5) !important; 214 | --success-6: var(--green-6) !important; 215 | --success-7: var(--green-7) !important; 216 | --success-8: var(--green-8) !important; 217 | --success-9: var(--green-9) !important; 218 | --success-10: var(--green-10) !important; 219 | --danger-1: 77, 0, 10 !important; 220 | --danger-2: 120, 9, 20 !important; 221 | --danger-3: 163, 28, 38 !important; 222 | --danger-4: 207, 57, 62 !important; 223 | --danger-5: 250, 93, 93 !important; 224 | --danger-6: 251, 123, 119 !important; 225 | --danger-7: 252, 154, 147 !important; 226 | --danger-8: 253, 183, 176 !important; 227 | --danger-9: 254, 211, 204 !important; 228 | --danger-10: 255, 237, 233 !important; 229 | --warning-1: 77, 48, 0 !important; 230 | --warning-2: 121, 82, 4 !important; 231 | --warning-3: 166, 119, 10 !important; 232 | --warning-4: 210, 159, 19 !important; 233 | --warning-5: 255, 202, 31 !important; 234 | --warning-6: 255, 211, 38 !important; 235 | --warning-7: 255, 227, 87 !important; 236 | --warning-8: 255, 240, 135 !important; 237 | --warning-9: 255, 248, 184 !important; 238 | --warning-10: 255, 253, 232 !important; 239 | } 240 | -------------------------------------------------------------------------------- /nuxt/app/assets/css/style.min.css: -------------------------------------------------------------------------------- 1 | body { 2 | --color-white: #ffffff !important; 3 | --color-black: #000000 !important; 4 | --color-border: rgb(var(--gray-3)) !important; 5 | --color-bg-popup: var(--color-bg-5) !important; 6 | --color-bg-1: #fff !important; 7 | --color-bg-2: #fff !important; 8 | --color-bg-3: #fff !important; 9 | --color-bg-4: #fff !important; 10 | --color-bg-5: #fff !important; 11 | --color-bg-white: #fff !important; 12 | --color-neutral-1: rgb(var(--gray-1)) !important; 13 | --color-neutral-2: rgb(var(--gray-2)) !important; 14 | --color-neutral-3: rgb(var(--gray-3)) !important; 15 | --color-neutral-4: rgb(var(--gray-4)) !important; 16 | --color-neutral-5: rgb(var(--gray-5)) !important; 17 | --color-neutral-6: rgb(var(--gray-6)) !important; 18 | --color-neutral-7: rgb(var(--gray-7)) !important; 19 | --color-neutral-8: rgb(var(--gray-8)) !important; 20 | --color-neutral-9: rgb(var(--gray-9)) !important; 21 | --color-neutral-10: rgb(var(--gray-10)) !important; 22 | --color-text-1: var(--color-neutral-10) !important; 23 | --color-text-2: var(--color-neutral-8) !important; 24 | --color-text-3: var(--color-neutral-6) !important; 25 | --color-text-4: var(--color-neutral-4) !important; 26 | --color-border-1: #ebebeb !important; 27 | --color-border-2: #d5d8dd !important; 28 | --color-border-3: var(--color-neutral-4) !important; 29 | --color-border-4: #9da4ae !important; 30 | --color-fill-1: var(--color-neutral-1) !important; 31 | --color-fill-2: var(--color-neutral-2) !important; 32 | --color-fill-3: var(--color-neutral-3) !important; 33 | --color-fill-4: var(--color-neutral-4) !important; 34 | --color-primary-light-1: rgb(var(--primary-1)) !important; 35 | --color-primary-light-2: rgb(var(--primary-2)) !important; 36 | --color-primary-light-3: rgb(var(--primary-3)) !important; 37 | --color-primary-light-4: rgb(var(--primary-4)) !important; 38 | --color-secondary: var(--color-neutral-2) !important; 39 | --color-secondary-hover: var(--color-neutral-3) !important; 40 | --color-secondary-active: var(--color-neutral-4) !important; 41 | --color-secondary-disabled: var(--color-neutral-1) !important; 42 | --color-danger-light-1: rgb(var(--danger-1)) !important; 43 | --color-danger-light-2: rgb(var(--danger-2)) !important; 44 | --color-danger-light-3: rgb(var(--danger-3)) !important; 45 | --color-danger-light-4: rgb(var(--danger-4)) !important; 46 | --color-success-light-1: rgb(var(--success-1)) !important; 47 | --color-success-light-2: rgb(var(--success-2)) !important; 48 | --color-success-light-3: rgb(var(--success-3)) !important; 49 | --color-success-light-4: rgb(var(--success-4)) !important; 50 | --color-warning-light-1: rgb(var(--warning-1)) !important; 51 | --color-warning-light-2: rgb(var(--warning-2)) !important; 52 | --color-warning-light-3: rgb(var(--warning-3)) !important; 53 | --color-warning-light-4: rgb(var(--warning-4)) !important; 54 | --color-link-light-1: rgb(var(--link-1)) !important; 55 | --color-link-light-2: rgb(var(--link-2)) !important; 56 | --color-link-light-3: rgb(var(--link-3)) !important; 57 | --color-link-light-4: rgb(var(--link-4)) !important; 58 | --color-data-1: rgb(var(--arcoblue-5)) !important; 59 | --color-data-2: rgb(var(--arcoblue-3)) !important; 60 | --color-data-3: rgb(var(--blue-5)) !important; 61 | --color-data-4: rgb(var(--blue-3)) !important; 62 | --color-data-5: rgb(var(--orange-6)) !important; 63 | --color-data-6: rgb(var(--orange-3)) !important; 64 | --color-data-7: rgb(var(--green-4)) !important; 65 | --color-data-8: rgb(var(--green-3)) !important; 66 | --color-data-9: rgb(var(--purple-4)) !important; 67 | --color-data-10: rgb(var(--purple-3)) !important; 68 | --color-data-11: rgb(var(--gold-6)) !important; 69 | --color-data-12: rgb(var(--gold-4)) !important; 70 | --color-data-13: rgb(var(--lime-6)) !important; 71 | --color-data-14: rgb(var(--lime-4)) !important; 72 | --color-data-15: rgb(var(--magenta-4)) !important; 73 | --color-data-16: rgb(var(--magenta-3)) !important; 74 | --color-data-17: rgb(var(--cyan-6)) !important; 75 | --color-data-18: rgb(var(--cyan-3)) !important; 76 | --color-data-19: rgb(var(--pinkpurple-4)) !important; 77 | --color-data-20: rgb(var(--pinkpurple-2)) !important; 78 | --border-radius-none: 0 !important; 79 | --border-radius-small: 0.375rem !important; 80 | --border-radius-medium: 0.375rem !important; 81 | --border-radius-large: 0.375rem !important; 82 | --border-radius-circle: 50% !important; 83 | --color-tooltip-bg: rgb(var(--gray-10)) !important; 84 | --color-spin-layer-bg: rgba(255, 255, 255, 0.6) !important; 85 | --color-menu-dark-bg: #232324 !important; 86 | --color-menu-light-bg: #ffffff !important; 87 | --color-menu-dark-hover: rgba(255, 255, 255, 0.04) !important; 88 | --color-mask-bg: rgba(29, 33, 41, 0.6) !important; 89 | --font-weight-100: 100 !important; 90 | --font-weight-200: 200 !important; 91 | --font-weight-300: 300 !important; 92 | --font-weight-400: 400 !important; 93 | --font-weight-500: 500 !important; 94 | --font-weight-600: 600 !important; 95 | --font-weight-700: 700 !important; 96 | --font-weight-800: 800 !important; 97 | --font-weight-900: 900 !important; 98 | --red-1: 255, 236, 232 !important; 99 | --red-2: 253, 205, 197 !important; 100 | --red-3: 251, 172, 163 !important; 101 | --red-4: 249, 137, 129 !important; 102 | --red-5: 247, 101, 96 !important; 103 | --red-6: 245, 63, 63 !important; 104 | --red-7: 203, 39, 45 !important; 105 | --red-8: 161, 21, 30 !important; 106 | --red-9: 119, 8, 19 !important; 107 | --red-10: 77, 0, 10 !important; 108 | --orangered-1: 255, 243, 232 !important; 109 | --orangered-2: 253, 221, 195 !important; 110 | --orangered-3: 252, 197, 159 !important; 111 | --orangered-4: 250, 172, 123 !important; 112 | --orangered-5: 249, 144, 87 !important; 113 | --orangered-6: 247, 114, 52 !important; 114 | --orangered-7: 204, 81, 32 !important; 115 | --orangered-8: 162, 53, 17 !important; 116 | --orangered-9: 119, 31, 6 !important; 117 | --orangered-10: 77, 14, 0 !important; 118 | --orange-1: 255, 247, 232 !important; 119 | --orange-2: 255, 228, 186 !important; 120 | --orange-3: 255, 207, 139 !important; 121 | --orange-4: 255, 182, 93 !important; 122 | --orange-5: 255, 154, 46 !important; 123 | --orange-6: 255, 125, 0 !important; 124 | --orange-7: 210, 95, 0 !important; 125 | --orange-8: 166, 69, 0 !important; 126 | --orange-9: 121, 46, 0 !important; 127 | --orange-10: 77, 27, 0 !important; 128 | --gold-1: 255, 252, 232 !important; 129 | --gold-2: 253, 244, 191 !important; 130 | --gold-3: 252, 233, 150 !important; 131 | --gold-4: 250, 220, 109 !important; 132 | --gold-5: 249, 204, 69 !important; 133 | --gold-6: 247, 186, 30 !important; 134 | --gold-7: 204, 146, 19 !important; 135 | --gold-8: 162, 109, 10 !important; 136 | --gold-9: 119, 75, 4 !important; 137 | --gold-10: 77, 45, 0 !important; 138 | --yellow-1: 254, 255, 232 !important; 139 | --yellow-2: 254, 254, 190 !important; 140 | --yellow-3: 253, 250, 148 !important; 141 | --yellow-4: 252, 242, 107 !important; 142 | --yellow-5: 251, 232, 66 !important; 143 | --yellow-6: 250, 220, 25 !important; 144 | --yellow-7: 207, 175, 15 !important; 145 | --yellow-8: 163, 132, 8 !important; 146 | --yellow-9: 120, 93, 3 !important; 147 | --yellow-10: 77, 56, 0 !important; 148 | --lime-1: 252, 255, 232 !important; 149 | --lime-2: 237, 248, 187 !important; 150 | --lime-3: 220, 241, 144 !important; 151 | --lime-4: 201, 233, 104 !important; 152 | --lime-5: 181, 226, 65 !important; 153 | --lime-6: 159, 219, 29 !important; 154 | --lime-7: 126, 183, 18 !important; 155 | --lime-8: 95, 148, 10 !important; 156 | --lime-9: 67, 112, 4 !important; 157 | --lime-10: 42, 77, 0 !important; 158 | --green-1: 232, 255, 234 !important; 159 | --green-2: 175, 240, 181 !important; 160 | --green-3: 123, 225, 136 !important; 161 | --green-4: 76, 210, 99 !important; 162 | --green-5: 35, 195, 67 !important; 163 | --green-6: 0, 180, 42 !important; 164 | --green-7: 0, 154, 41 !important; 165 | --green-8: 0, 128, 38 !important; 166 | --green-9: 0, 102, 34 !important; 167 | --green-10: 0, 77, 28 !important; 168 | --cyan-1: 232, 255, 251 !important; 169 | --cyan-2: 183, 244, 236 !important; 170 | --cyan-3: 137, 233, 224 !important; 171 | --cyan-4: 94, 223, 214 !important; 172 | --cyan-5: 55, 212, 207 !important; 173 | --cyan-6: 20, 201, 201 !important; 174 | --cyan-7: 13, 165, 170 !important; 175 | --cyan-8: 7, 130, 139 !important; 176 | --cyan-9: 3, 97, 108 !important; 177 | --cyan-10: 0, 66, 77 !important; 178 | --blue-1: 232, 247, 255 !important; 179 | --blue-2: 195, 231, 254 !important; 180 | --blue-3: 159, 212, 253 !important; 181 | --blue-4: 123, 192, 252 !important; 182 | --blue-5: 87, 169, 251 !important; 183 | --blue-6: 52, 145, 250 !important; 184 | --blue-7: 32, 108, 207 !important; 185 | --blue-8: 17, 75, 163 !important; 186 | --blue-9: 6, 48, 120 !important; 187 | --blue-10: 0, 26, 77 !important; 188 | --arcoblue-1: 232, 243, 255 !important; 189 | --arcoblue-2: 190, 218, 255 !important; 190 | --arcoblue-3: 148, 191, 255 !important; 191 | --arcoblue-4: 106, 161, 255 !important; 192 | --arcoblue-5: 64, 128, 255 !important; 193 | --arcoblue-6: 22, 93, 255 !important; 194 | --arcoblue-7: 14, 66, 210 !important; 195 | --arcoblue-8: 7, 44, 166 !important; 196 | --arcoblue-9: 3, 26, 121 !important; 197 | --arcoblue-10: 0, 13, 77 !important; 198 | --purple-1: 245, 232, 255 !important; 199 | --purple-2: 221, 190, 246 !important; 200 | --purple-3: 195, 150, 237 !important; 201 | --purple-4: 168, 113, 227 !important; 202 | --purple-5: 141, 78, 218 !important; 203 | --purple-6: 114, 46, 209 !important; 204 | --purple-7: 85, 29, 176 !important; 205 | --purple-8: 60, 16, 143 !important; 206 | --purple-9: 39, 6, 110 !important; 207 | --purple-10: 22, 0, 77 !important; 208 | --pinkpurple-1: 255, 232, 251 !important; 209 | --pinkpurple-2: 247, 186, 239 !important; 210 | --pinkpurple-3: 240, 142, 230 !important; 211 | --pinkpurple-4: 232, 101, 223 !important; 212 | --pinkpurple-5: 225, 62, 219 !important; 213 | --pinkpurple-6: 217, 26, 217 !important; 214 | --pinkpurple-7: 176, 16, 182 !important; 215 | --pinkpurple-8: 138, 9, 147 !important; 216 | --pinkpurple-9: 101, 3, 112 !important; 217 | --pinkpurple-10: 66, 0, 77 !important; 218 | --magenta-1: 255, 232, 241 !important; 219 | --magenta-2: 253, 194, 219 !important; 220 | --magenta-3: 251, 157, 199 !important; 221 | --magenta-4: 249, 121, 183 !important; 222 | --magenta-5: 247, 84, 168 !important; 223 | --magenta-6: 245, 49, 157 !important; 224 | --magenta-7: 203, 30, 131 !important; 225 | --magenta-8: 161, 16, 105 !important; 226 | --magenta-9: 119, 6, 79 !important; 227 | --magenta-10: 77, 0, 52 !important; 228 | --gray-1: 247, 248, 250 !important; 229 | --gray-2: 242, 243, 245 !important; 230 | --gray-3: 229, 230, 235 !important; 231 | --gray-4: 201, 205, 212 !important; 232 | --gray-5: 169, 174, 184 !important; 233 | --gray-6: 134, 144, 156 !important; 234 | --gray-7: 107, 119, 133 !important; 235 | --gray-8: 78, 89, 105 !important; 236 | --gray-9: 39, 46, 59 !important; 237 | --gray-10: 29, 33, 41 !important; 238 | --primary-1: 232, 255, 244 !important; 239 | --primary-2: 187, 243, 219 !important; 240 | --primary-3: 145, 231, 196 !important; 241 | --primary-4: 106, 219, 178 !important; 242 | --primary-5: 71, 207, 162 !important; 243 | --primary-6: 9, 189, 127 !important; 244 | --primary-7: 25, 165, 128 !important; 245 | --primary-8: 14, 136, 107 !important; 246 | --primary-9: 5, 106, 86 !important; 247 | --primary-10: 0, 77, 64 !important; 248 | --link-1: 232, 255, 244 !important; 249 | --link-2: 176, 240, 210 !important; 250 | --link-3: 125, 225, 182 !important; 251 | --link-4: 80, 209, 158 !important; 252 | --link-5: 40, 194, 138 !important; 253 | --link-6: 3, 169, 113 !important; 254 | --link-7: 3, 153, 108 !important; 255 | --link-8: 2, 128, 94 !important; 256 | --link-9: 1, 102, 78 !important; 257 | --link-10: 0, 77, 61 !important; 258 | --success-1: 232, 255, 244 !important; 259 | --success-2: 176, 240, 210 !important; 260 | --success-3: 125, 225, 182 !important; 261 | --success-4: 80, 209, 158 !important; 262 | --success-5: 40, 194, 138 !important; 263 | --success-6: 5, 179, 120 !important; 264 | --success-7: 3, 153, 108 !important; 265 | --success-8: 2, 128, 94 !important; 266 | --success-9: 1, 102, 78 !important; 267 | --success-10: 0, 77, 61 !important; 268 | --danger-1: 255, 236, 232 !important; 269 | --danger-2: 254, 208, 201 !important; 270 | --danger-3: 253, 179, 171 !important; 271 | --danger-4: 253, 148, 141 !important; 272 | --danger-5: 252, 116, 111 !important; 273 | --danger-6: 251, 81, 81 !important; 274 | --danger-7: 207, 50, 55 !important; 275 | --danger-8: 164, 26, 36 !important; 276 | --danger-9: 120, 10, 21 !important; 277 | --danger-10: 77, 0, 10 !important; 278 | --warning-1: 255, 251, 232 !important; 279 | --warning-2: 254, 241, 193 !important; 280 | --warning-3: 254, 229, 155 !important; 281 | --warning-4: 253, 214, 116 !important; 282 | --warning-5: 244, 186, 64 !important; 283 | --warning-6: 252, 177, 40 !important; 284 | --warning-7: 230, 135, 37 !important; 285 | --warning-8: 164, 101, 13 !important; 286 | --warning-9: 120, 68, 5 !important; 287 | --warning-10: 77, 40, 0 !important; 288 | } 289 | .arco-page-header-wrapper { 290 | padding-right: 0px !important; 291 | padding-left: 0px !important; 292 | } 293 | 294 | .arco-btn-size-medium { 295 | --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); 296 | --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); 297 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), 298 | var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 299 | } 300 | .arco-tabs-nav { 301 | background-color: #ffffff00; 302 | -webkit-backdrop-filter: blur(15px); 303 | backdrop-filter: blur(15px); 304 | border-radius: var(--border-radius-small); 305 | } 306 | -------------------------------------------------------------------------------- /nuxt/app/pages/workflow.vue: -------------------------------------------------------------------------------- 1 | 204 | 205 | 980 | 1003 | -------------------------------------------------------------------------------- /nuxt/app/pages/bot.vue: -------------------------------------------------------------------------------- 1 | 433 | 924 | 949 | --------------------------------------------------------------------------------