基于Ollama与Next.js的本地大模型Web对话界面部署与优化指南
1. 项目概述一个为本地大模型量身定制的对话界面如果你和我一样对开源大语言模型LLM充满热情喜欢在本地部署Llama、Mistral、Qwen这些模型体验那种数据完全自主掌控的快感那么你一定遇到过这个痛点模型跑起来了但怎么跟它“聊天”难道每次都去敲命令行用curl发JSON请求这体验也太不友好了。这正是run-llama/chat-ui项目诞生的背景。它不是一个通用的聊天机器人前端而是一个专门为本地或私有化部署的大语言模型设计的、开源的Web用户界面。你可以把它理解为一个“本地版的ChatGPT网页界面”但它背后连接的是你自己服务器上的模型而不是远在云端的API。这个项目解决了从“拥有一个模型”到“用好一个模型”之间的关键一环。它让你能通过一个美观、现代、功能丰富的网页像使用主流AI产品一样与你的本地模型交互。支持多轮对话、流式响应、模型切换、对话历史管理甚至文件上传结合RAG应用极大地降低了本地LLM的应用门槛。无论是个人开发者做技术验证还是团队内部搭建知识问答工具chat-ui都是一个极佳的起点。2. 核心架构与设计哲学拆解2.1 前后端分离的现代化应用架构chat-ui采用了清晰的前后端分离架构这是其能够灵活适配多种后端模型服务的关键。前端是一个基于Next.jsReact框架构建的单页应用SPA提供了所有的用户交互界面。Next.js的选择保证了应用的性能、SEO友好性虽然对内部工具不重要以及良好的开发体验。UI组件库方面项目使用了Tailwind CSS进行样式构建这使得界面既现代又易于定制。后端则并非一个完整的、独立的服务而更像一个“适配层”或“代理层”。它的核心职责是接收前端发送的聊天请求将其转换成后端LLM服务如Ollama、OpenAI兼容API、LocalAI等能够理解的格式然后将模型的流式响应再转发回前端。这种设计让chat-ui本身不承担模型推理的重任保持了轻量化和专注性。2.2 核心设计与Ollama的深度集成虽然chat-ui设计上支持多种后端但其与Ollama的集成是最为紧密和“原生”的。Ollama已经成为在本地运行、管理开源LLM的事实标准工具它提供了简单的命令行拉取和运行模型的能力。chat-ui默认配置和文档都优先围绕Ollama展开。它通过调用Ollama提供的本地REST API默认在http://localhost:11434来与模型交互。这种集成意味着无缝模型发现chat-ui可以自动列出你本地Ollama中已经拉取pull的所有模型。统一的对话接口无论你运行的是Llama 3.1 8B还是Qwen2.5 32Bchat-ui都通过相同的Ollama API格式发送请求简化了配置。便捷的参数调整温度temperature、top_p等关键生成参数可以直接在UI上调整并传递给Ollama。这种以Ollama为中心的设计极大地简化了普通用户的部署流程你只需要安装好Ollama、拉取模型然后启动chat-ui两者就能自动协作。2.3 可扩展性支持多后端与自定义适配除了Ollamachat-ui的架构也考虑到了扩展性。它通过配置文件可以轻松连接到其他提供OpenAI API兼容接口的后端服务。这包括LocalAI另一个功能强大的本地推理框架支持更多模型格式和硬件加速后端如GGUF llama.cpp。自建的FastAPI/Transformers服务如果你用Python的transformers库自己封装了一个模型服务只要它暴露的API端点符合OpenAI的/v1/chat/completions格式chat-ui就能连接。云服务商的兼容API一些云服务商提供的LLM API也兼容OpenAI格式理论上也可以接入但这偏离了其“本地优先”的初衷。这种兼容性设计使得chat-ui不仅仅是一个Ollama的附属品而成为一个通用的、面向“类OpenAI API”的聊天前端适应更广泛的私有化部署场景。3. 从零开始的完整部署与配置实操3.1 基础环境准备Node.js与Ollama部署chat-ui的第一步是准备好它的运行环境。由于前端是基于Node.js的所以你需要先安装Node.js环境建议版本18或以上和包管理工具npm或yarn。你可以从Node.js官网下载安装包或者使用nvmNode Version Manager来管理多个版本这对于开发者来说更加方便。接下来是模型运行环境。我们以最常用的Ollama为例。安装Ollama访问Ollama官网根据你的操作系统Windows/macOS/Linux下载并安装。安装过程非常简单几乎是一键完成。拉取模型打开终端使用Ollama拉取你感兴趣的模型。例如拉取一个中等尺寸的通用模型ollama pull llama3.2:1b # 拉取一个1B参数的小模型适合快速测试 # 或者拉取更强大的模型 ollama pull qwen2.5:7b首次拉取需要下载数GB的模型文件请确保网络通畅和足够的磁盘空间。运行模型拉取完成后你可以让Ollama在后台运行这个模型的服务。ollama run llama3.2:1b运行后Ollama的API服务就会在http://localhost:11434启动。你可以通过curl命令简单测试一下curl http://localhost:11434/api/generate -d { model: llama3.2:1b, prompt: Hello, how are you?, stream: false }如果能收到一个JSON格式的回复说明Ollama服务正常。注意Ollama默认只监听本地回环地址127.0.0.1。如果你希望在同一网络的其他设备上访问chat-ui需要在启动Ollama时设置环境变量OLLAMA_HOST0.0.0.0但这会带来安全风险仅建议在可信的局域网内网环境中使用。3.2 获取与配置Chat UI环境准备好后我们来部署chat-ui本身。克隆项目git clone https://github.com/run-llama/chat-ui.git cd chat-ui安装依赖使用npm或yarn安装项目所需的所有Node模块。npm install # 或 yarn install这个过程可能会花费几分钟取决于你的网络速度。配置环境变量chat-ui的配置主要通过环境变量或一个.env.local文件完成。在项目根目录下复制示例环境文件并修改cp .env.example .env.local打开.env.local文件最关键的一行配置是DEFAULT_MODELllama3.2:1b OLLAMA_API_BASE_URLhttp://localhost:11434/apiDEFAULT_MODEL设置默认使用的模型名称必须与Ollama中拉取的模型名完全一致。OLLAMA_API_BASE_URL指向你的Ollama服务API地址。如果你按默认安装这里不需要修改。3.3 启动服务与初次对话配置完成后启动开发服务器npm run dev # 或 yarn dev如果一切顺利终端会输出类似 Ready on http://localhost:3000的信息。此时打开你的浏览器访问http://localhost:3000你就能看到chat-ui的界面了。首次进入界面通常很简洁。在底部的输入框尝试发送一条消息比如“介绍一下你自己”。你应该能看到界面右上角或模型选择处显示正在连接Ollama然后模型开始流式地一个字一个字地输出回答。恭喜你你的本地大模型聊天室已经搭建成功实操心得第一次启动时如果前端报错“无法连接到模型服务”99%的问题出在Ollama服务未正常运行或网络不通。请按以下步骤排查在终端执行ollama list确认模型已存在。执行curl http://localhost:11434/api/tags确认Ollama API能返回模型列表。检查.env.local文件中的OLLAMA_API_BASE_URL是否正确特别注意端口是否为11434。确保没有其他程序占用了3000或11434端口。4. 核心功能深度解析与高级用法4.1 对话管理不止于单轮问答chat-ui的核心是一个完整的对话管理系统。每开启一个新的浏览器标签页本质上就创建了一个新的“会话”Session。在这个会话中所有的消息历史都会被保存在前端的内存中默认情况下并随着对话的进行不断累积。这意味着你可以进行真正的多轮对话。模型能够基于整个对话上下文来生成回复。你可以追问、让模型修正之前的回答、或者切换话题。界面左侧通常会有对话历史列表你可以点击不同的历史记录来回溯之前的对话这对于对比不同模型的回答或者继续未完成的讨论非常有用。消息格式与角色每条消息都有明确的角色Role标识User用户输入的问题或指令。Assistant模型生成的回复。System系统提示词System Prompt用于在对话开始时设定模型的角色、行为规范或知识边界。你可以在UI的设置或模型配置中修改它。通过灵活运用System Prompt你可以极大地改变模型的行为。例如你可以将其设定为“你是一个专业的Python编程助手回答要简洁、准确只提供代码和关键解释”那么模型在整个对话中都会尽量遵循这个设定。4.2 模型参数调优从“胡言乱语”到“言之有物”直接使用默认参数运行模型结果可能不稳定时而精彩时而离谱。chat-ui提供了便捷的界面来调整关键生成参数这是提升对话质量的关键。在聊天界面通常有一个设置Settings或模型配置Model Config的按钮点击后可以调整以下核心参数参数名作用与原理常用范围调整建议温度 (Temperature)控制输出的随机性。值越高如0.8-1.2回答越创造性、多样化但也可能更不连贯值越低如0.1-0.3回答越确定、保守倾向于选择最高概率的词可能变得重复。0.1 ~ 1.5对于需要事实准确性的问答建议0.1-0.3对于创意写作、头脑风暴可以调到0.7-1.0。Top-p (核采样)与温度配合使用从概率累积超过p的最小词集合中采样。值越低候选词集越小输出越确定值越高候选词集越大输出越多样。0.1 ~ 1.0通常设置为0.9-0.95能在保持一定创造性的同时避免选择极低概率的奇怪词汇。最大生成长度 (Max Tokens)限制模型单次回复的最大长度以Token计。取决于模型上下文长度对于7B/8B模型设置1024或2048通常足够。设置过低会导致回答被截断过高则可能浪费资源。重复惩罚 (Repeat Penalty)对已出现过的文本进行惩罚降低其再次被生成的概率有效减少重复和循环。1.0 ~ 1.5如果发现模型经常重复短语或句子可以适当调高如1.1或1.2。我的经验是对于大多数知识问答和逻辑推理任务一套比较稳健的参数是Temperature0.2, Top-p0.9, Max Tokens2048。你可以先以此为基础根据具体模型和任务进行微调。4.3 文件上传与RAG功能初探chat-ui的一个高级功能是支持文件上传。这不仅仅是把文件作为附件发送其背后是与检索增强生成RAG工作流的集成。当你上传一个PDF、TXT或Word文档时chat-ui通常需要配合后端RAG服务如llama_index或langchain的相关项目会执行以下操作文档加载与解析读取文件内容并将其拆分成更小的、有意义的文本块Chunks。向量化与存储使用嵌入模型Embedding Model将每个文本块转换为向量一组数字并存入向量数据库如Chroma、Qdrant。检索当你提出问题时系统将你的问题也转换为向量并在向量数据库中搜索与之最相关的文本块。增强生成将检索到的相关文本块作为额外的上下文与你的原始问题一起提交给大语言模型让模型基于这些“证据”来生成回答。这样生成的答案不仅基于模型自身的知识还基于你提供的私有文档准确性、相关性和可信度都大大提升。这对于构建企业知识库、个人文档助手等场景至关重要。在chat-ui中这个功能可能以插件或扩展配置的形式出现。你需要额外部署一个RAG后端服务例如使用llama_index搭建一个索引和查询服务并在chat-ui的配置中指向该服务的API端点。这涉及到更复杂的架构但chat-ui提供了与之对接的可能性为构建复杂应用打开了大门。5. 生产环境部署与性能优化考量5.1 从开发模式到生产构建我们之前使用的npm run dev是开发服务器带热重载等功能适合调试但不适合长期稳定运行。要部署到生产环境需要构建静态文件或启动生产服务器。构建静态文件Next.js可以输出静态HTML文件。npm run build执行后所有资源会被优化并打包到.next目录下的standalone文件夹中具体取决于Next.js配置。你可以将这个文件夹复制到任何支持静态文件服务的Web服务器如Nginx、Apache上。使用生产服务器更常见的方式是使用Next.js自带的生产服务器。npm run build npm startnpm start会启动一个优化过的生产服务器性能更好更适合长期运行。5.2 使用Docker容器化部署为了环境一致性和部署便利强烈推荐使用Docker。chat-ui项目通常提供了Dockerfile。构建Docker镜像docker build -t chat-ui .运行容器运行容器时需要通过环境变量传入配置。docker run -p 3000:3000 \ -e DEFAULT_MODELllama3.2:1b \ -e OLLAMA_API_BASE_URLhttp://host.docker.internal:11434/api \ chat-ui这里的关键是OLLAMA_API_BASE_URL。如果Ollama运行在宿主机上容器内需要通过host.docker.internalMac/Windows Docker Desktop或宿主机的实际IP地址来访问。更成熟的部署方式是使用docker-compose.yml文件将chat-ui和Ollama甚至向量数据库的服务定义在一起一键启动整个栈。version: 3.8 services: ollama: image: ollama/ollama:latest container_name: ollama ports: - 11434:11434 volumes: - ollama_data:/root/.ollama restart: unless-stopped chat-ui: build: . container_name: chat-ui ports: - 3000:3000 environment: - DEFAULT_MODELllama3.2:1b - OLLAMA_API_BASE_URLhttp://ollama:11434/api depends_on: - ollama restart: unless-stopped volumes: ollama_data:这个配置定义了两个服务并建立了网络连接chat-ui容器内可以通过服务名ollama直接访问Ollama的API。5.3 性能监控与问题排查当chat-ui投入实际使用后一些性能问题可能会浮现。前端性能如果对话历史非常长成千上万条消息前端React渲染可能会变慢。这是因为所有历史消息都保存在前端内存中。解决方案可以考虑定期清理本地存储的对话历史。对于超长对话可以尝试在后端实现对话历史的分页加载而不是一次性全部加载但这需要修改chat-ui的代码。后端Ollama性能这是性能瓶颈的主要来源。模型推理速度取决于你的硬件CPU/GPU、模型大小和参数设置。观察GPU利用率如果使用GPU使用nvidia-smi命令监控显存占用和计算利用率。如果利用率低可能是CPU成为了瓶颈例如在预处理数据或者模型本身未完全适配GPU。调整Ollama参数Ollama运行模型时可以指定并行度、线程数等。例如ollama run llama3.2:7b --num-parallel 4。具体参数需要参考Ollama文档和你的硬件情况。模型量化这是提升推理速度、降低资源占用的最有效手段。使用GGUF格式的量化模型如q4_K_M, q8_0可以在几乎不损失精度的情况下大幅提升速度并降低显存需求。在Ollama中你可以直接拉取已量化的模型如ollama pull llama3.2:7b-q4_K_M。网络延迟如果chat-ui和Ollama部署在不同的机器上网络延迟会成为影响流式响应体验的关键。确保它们之间的网络带宽充足、延迟低。在局域网内部署通常是最佳实践。6. 安全加固与权限管理实践6.1 基础访问控制认证与授权默认情况下部署好的chat-ui和Ollama都是没有密码的任何能访问IP地址的人都可以使用或操作你的模型这非常危险。在生产环境必须添加访问控制。为Ollama添加基础认证Ollama本身支持简单的HTTP基础认证。你需要修改Ollama的配置文件通常位于~/.ollama/config.json或C:\Users\用户名\.ollama\config.json。{ host: 127.0.0.1, port: 11434, auth: { type: basic, username: your_username, password: your_strong_password } }重启Ollama后chat-ui中的OLLAMA_API_BASE_URL就需要包含用户名和密码了http://username:passwordlocalhost:11434/api。注意将密码明文写在环境变量或代码中仍有风险这只是基础防护。为Chat UI添加认证chat-ui项目本身不内置强大的用户管理系统。实现认证有几种思路反向代理层认证更推荐的做法。在chat-ui前面部署一个反向代理如Nginx、Caddy、Traefik由反向代理来提供认证。例如使用Nginx的auth_basic模块实现简单的用户名密码认证或者集成更复杂的OAuth2、LDAP等。# Nginx 配置示例片段 location / { auth_basic Restricted Access; auth_basic_user_file /etc/nginx/.htpasswd; # 使用htpasswd创建密码文件 proxy_pass http://localhost:3000; proxy_set_header Host $host; ...其他代理设置 }这样用户访问chat-ui前必须先通过Nginx的认证。使用第三方身份提供商对于企业环境可以配置反向代理与Okta、Auth0、Keycloak等身份提供商IdP集成实现单点登录SSO。修改Chat UI源码在Next.js应用中集成NextAuth.js等认证库但这需要一定的开发工作量。6.2 网络层隔离与防火墙策略除了应用层认证网络层的隔离同样重要。最小化暴露Ollama服务端口11434绝对不应该暴露在公网。它应该只监听内网地址127.0.0.1或内部网络IP并且只允许chat-ui所在的服务器访问。使用内部网络在Docker或Kubernetes部署中为chat-ui和Ollama创建一个独立的、非桥接的Docker网络让它们在这个内部网络中通信。配置防火墙在宿主机上使用防火墙如ufw、firewalld或Windows防火墙严格限制对11434和3000端口的访问只允许特定的IP地址段如管理员的IP或根本不允许任何外部访问如果chat-ui也通过反向代理暴露在另一个端口。6.3 数据安全与隐私考量使用本地模型的核心优势就是数据隐私。但仍需注意对话历史存储默认情况下chat-ui的对话历史保存在浏览器的本地存储LocalStorage中。这意味着历史记录存在于每个用户的浏览器里清除浏览器数据就会丢失。如果你需要集中存储和备份需要修改chat-ui代码将其连接到后端数据库如PostgreSQL、SQLite。上传文件处理如果启用了文件上传和RAG功能务必注意上传文件的存储安全。这些文件可能包含敏感信息。需要确保存储目录的权限正确并定期清理临时文件。在RAG流程中嵌入模型和向量数据库也可能运行在第三方服务上需要评估其数据出境风险最好全部部署在本地。系统提示词安全System Prompt是控制模型行为的重要工具但也可能被恶意用户通过某些方式覆盖或绕过。确保前端输入经过校验避免注入攻击。对于高安全场景可以将关键的系统提示词固化在后端而不是由前端完全控制。7. 常见问题排查与实战技巧汇编在实际部署和使用chat-ui的过程中你会遇到各种各样的问题。下面是我总结的一些典型问题及其解决方法希望能帮你快速排雷。7.1 连接与启动类问题问题1Chat UI页面打开后一直显示“连接中”或“无法连接到模型服务”。这是最常见的问题。请按以下顺序排查检查Ollama服务状态在终端运行ollama serve或ollama list确认Ollama进程正在运行且没有报错。验证Ollama API可达性打开另一个终端运行curl http://localhost:11434/api/tags。你应该能收到一个包含已安装模型列表的JSON响应。如果报错“连接拒绝”说明Ollama服务没起来如果报错“404”可能是Ollama版本较旧API路径有变化。检查Chat UI配置确认.env.local文件中的OLLAMA_API_BASE_URL设置正确。如果是Docker部署特别注意容器间的网络连通性。在容器内尝试curl http://ollama:11434/api/tags使用服务名或宿主机的IP。检查端口占用确认3000端口和11434端口没有被其他程序占用。lsof -i :3000和lsof -i :11434Linux/macOS或netstat -ano | findstr :3000Windows可以帮助你查看。查看浏览器控制台日志按F12打开开发者工具切换到Console控制台标签页刷新页面并尝试发送消息。这里通常会显示更具体的JavaScript错误信息例如跨域CORS错误。如果出现CORS错误需要在启动Ollama时设置允许跨域例如OLLAMA_ORIGINS* ollama serve生产环境请替换为具体域名。问题2模型列表为空无法选择模型。chat-ui的模型列表是通过调用Ollama的/api/tags接口获取的。首先用curl直接测试这个接口是否能返回数据见上一步。如果curl能返回数据但chat-ui不显示可能是前端缓存或界面问题。尝试硬刷新浏览器CtrlF5。检查DEFAULT_MODEL环境变量中设置的模型名是否确实存在于Ollama的列表中。名称必须完全匹配包括大小写和标签如llama3.2:1b。7.2 模型推理与响应类问题问题3模型回复速度极慢或者回复到一半就中断了。这通常是资源不足或参数设置不当导致的。检查系统资源使用任务管理器、htop或nvidia-smi查看CPU、内存和GPU的利用率。如果内存或显存被占满模型加载或推理就会失败。尝试关闭其他占用资源的程序。调整模型大小如果你在CPU上运行一个70B的大模型速度慢是正常的。尝试换用更小的模型如7B、13B或量化版本带-q4_K_M等后缀的。检查Max Tokens参数如果Max Tokens设置得过大模型可能会生成非常长的文本消耗大量时间和资源。对于简单问答可以先设置为512或1024试试。查看Ollama日志Ollama服务本身可能会有错误日志输出到终端或日志文件中。查看是否有“out of memory”OOM或其他运行时错误。问题4模型回答质量差胡言乱语或重复。这主要是生成参数和提示词的问题。降低Temperature这是首要调整项。将温度从默认值可能是0.8或1.0降到0.2或0.3能让输出更集中、更确定。启用重复惩罚如果回答中频繁出现重复的句子或短语将Repeat Penalty参数调到1.1或1.2。优化System Prompt一个清晰、具体的系统提示词能极大地引导模型行为。例如明确告诉模型“你的回答应当简洁、准确基于事实。如果你不知道请直接说不知道不要编造信息。”尝试不同的模型不同模型的能力和“性格”差异很大。Llama系列可能更通用Qwen系列对中文支持更好Mistral系列在某些推理任务上表现突出。多尝试几个模型找到最适合你任务的。7.3 部署与配置类问题问题5Docker部署时Chat UI容器无法连接到Ollama容器。这是容器网络配置的经典问题。使用Docker Compose如上文示例在docker-compose.yml中定义服务Docker Compose会自动为它们创建一个共享网络服务间可以使用服务名通信。手动创建网络如果不用Compose可以手动创建一个Docker网络然后将两个容器都加入这个网络。docker network create llama-net docker run -d --name ollama --network llama-net ollama/ollama docker run -p 3000:3000 --network llama-net -e OLLAMA_API_BASE_URLhttp://ollama:11434/api chat-ui使用host网络模式在启动容器时添加--network host让容器共享宿主机的网络命名空间。这样在容器内就可以直接用localhost:11434访问宿主机上的Ollama。但这种方式降低了容器隔离性。问题6如何修改Chat UI的界面样式或功能chat-ui是开源项目你可以直接修改其源代码。界面样式项目使用Tailwind CSS样式定义通常与组件在同一文件中如*.tsx文件中的className。你可以修改这些类名或者在styles/globals.css中添加自定义样式。功能逻辑核心的聊天逻辑、API调用等在app/api/chat/route.ts或类似路径和相关的组件中。例如如果你想增加一个“重新生成回答”的按钮就需要在前端组件中添加按钮事件并调用后端的相应API。自定义构建修改代码后需要重新运行npm run build来构建新的生产版本。如果是Docker部署则需要重新构建镜像。7.4 一个实战技巧实现多模型快速切换默认情况下chat-ui一次只能连接一个后端模型服务。但有时我们想同时运行多个模型比如一个7B的快速模型和一个70B的高质量模型并在它们之间快速切换。这里分享一个我用Nginx做反向代理实现的小技巧。目标在一台服务器上运行两个Ollama实例分别加载不同模型并通过不同的URL路径暴露给chat-ui。启动两个Ollama实例需要为它们配置不同的端口和数据目录。# 实例1端口11434默认路径 OLLAMA_HOST0.0.0.0 OLLAMA_PORT11434 ollama serve # 实例2端口11435使用不同的数据目录 OLLAMA_HOST0.0.0.0 OLLAMA_PORT11435 OLLAMA_MODELS/path/to/ollama_models2 ollama serve然后分别在这两个实例中拉取不同的模型。配置Nginx反向代理编辑Nginx配置文件将不同的路径代理到不同的Ollama实例。http { upstream ollama_fast { server localhost:11434; } upstream ollama_smart { server localhost:11435; } server { listen 80; server_name your-domain.com; location /api/fast/ { proxy_pass http://ollama_fast/api/; # 重写请求路径去掉 /api/fast 前缀 rewrite ^/api/fast/(.*) /api/$1 break; proxy_set_header Host $host; } location /api/smart/ { proxy_pass http://ollama_smart/api/; rewrite ^/api/smart/(.*) /api/$1 break; proxy_set_header Host $host; } # Chat UI 前端服务 location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; } } }配置Chat UI你无法在一个UI实例中动态切换后端URL。但你可以部署两个chat-ui实例或者修改前端代码增加一个模型切换下拉框根据选择动态改变请求的API基础路径。更简单的方法是直接准备两个.env.local配置文件分别设置OLLAMA_API_BASE_URLhttp://your-domain.com/api/fast和.../api/smart然后启动两个chat-ui服务在不同端口通过不同的端口访问不同的模型前端。这个方案稍微有点复杂但它提供了极大的灵活性让你可以根据任务需求灵活调配不同的计算资源给不同的模型。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2581370.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!