news 2026/9/14 1:51:18

Ollama本地模型前端接入指南:从API调用到流式对话实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ollama本地模型前端接入指南:从API调用到流式对话实战

先聊一个挺常见的现象:很多人电脑里装好了 Ollama,命令行里模型也能聊,但一到“让网页/前端去调这个本地模型”就卡住了。要么不知道怎么把模型暴露成 HTTP 接口,要么前端跨域直接报错,要么拿到流式返回不知道怎么解析。这篇东西我不打算讲花活,就按我自己摸过一遍的路线来写:从 Ollama 的安装、模型选择、本地服务原理、API 参数,到前端完整接入的方式,包括流式输出、跨域、超时和并发这几个绕不过去的坑,全部走一遍。适合正准备把本地模型接到个人网站、内部工具或者毕设/练手项目里的前端开发者,也适合想搞清楚 Ollama 这层 HTTP 服务到底怎么工作的后端同学。

1. 为什么是 Ollama:本地模型与前端联动的核心链路

先理清一个底层逻辑:Ollama 本质上不是“模型本身”,它更像个模型运行时管理器。它帮你把 Llama、Qwen、DeepSeek 这些开源模型下载到本地,然后在你的 CPU/GPU 上把模型跑起来,并且对外暴露一个标准的 REST API。

换句话说,Ollama 是“本地模型的服务器”。前端要做的,只是跟这个服务器对话。搞清楚这一点,后面所有操作都不会乱。

1.1 本地模型对比云端 API 的真实差异

我最早做 AI 功能,第一反应是接云端 API,后来才感受到本地模型的不可替代性。举几个实际场景:

  • 数据不出内网:公司内部文档、客户隐私信息,直接传第三方 API,合规是一道大坎。
  • 离线可用:哪怕没外网,局域网内照样能给业务系统提供 AI 能力。
  • 长期成本摊薄:云 API 按 token 计费,高频调用一个月下来很可观;本地模型是一次性硬件投入,跑得越多越划算。
  • 调试自由:你可以随意换模型、改参数,不会因为账号欠费、限流把线上功能搞挂。

当然,本地模型也有代价:显存占用、推理速度、部署维护成本都在你自己身上。用一句不严谨但很实际的话形容——云 API 是“租房子”,本地模型是“买房装修”,前期折腾,后期自在。

1.2 Ollama 相比直接跑 transformers 的优势

肯定有人问:我直接用 Python 写 transformers 加载模型不行吗?为什么要多套一层 Ollama?

行,但没必要。直接跑 transformers 意味着你要自己处理:

  • Python 环境和 CUDA 版本匹配问题;
  • 模型权重下载及格式管理;
  • 显存释放与多进程并发;
  • HTTP 服务层封装(FastAPI + 队列 + 超时控制);
  • 各种兼容性和异常处理。

这套东西跑通,没有一两个星期下不来。而 Ollama 把这些全部封装好了,它还自带一个 GGUF 量化体系,能在不损失太多效果的前提下把模型压到很小的显存里运行。这是 Ollama 能在本地模型工具里“一枝独秀”的核心原因:把以前只有算法工程师能玩的东西,变成了普通开发者也能直接部署的能力。

所以,这个部署链路本质上就是:前端(浏览器) -> HTTP 请求 -> Ollama 本地服务 -> 模型推理 -> 流式返回 -> 前端逐字渲染。

后面所有内容都围绕这条链路展开。

2. 部署前的准备工作:环境、镜像源、模型选型

别看安装就是个curl命令的事,真正决定你能不能顺利跑起来的是环境判断和模型选择。我帮别人排查过不少问题,十个里有八个是跨过了这一步直接冲安装,最后在启动模型那一步疯狂报错。

2.1 硬件要求与操作系统判断

先确认你的电脑能不能跑。Ollama 的基本原则是:内存建议不低于 8GB,能调用 NVIDIA 显卡(N 卡)最好,没有显卡只靠 CPU 也能跑,只是速度感人。

我按自己经验整理了一张表,直接对照即可:

场景内存要求显卡要求推荐模型大小体验评价
日常体验、写文案16GB无或集显7B~8B 量化版够用,速度偏慢
开发助手、代码补全32GB8GB 显存低端卡7B~14B流畅,效果不错
正经生产环境64GB+24GB 显存中高端卡32B以上接近云端模型体验

一个很容易踩的误区:显存不够时,Ollama 会默认把模型塞一部分到内存里跑,不会直接报错,只是速度断崖式下跌。你会感觉“明明显存只占了一半,怎么生成一个字要 5 秒”——其实模型部分层已经跑在内存,靠 PCIe 通道与显卡通信,自然慢。

建议装完先别急着拉模型,先跑一句ollama --version确认安装成功,再跑ollama list看本地模型列表,最后用ollama ps看模型运行状态和显存占用。这三个命令是后面排查问题的基本功。

2.2 模型下载慢的解决办法:自定义镜像源与手动导入

国内用户最大的痛点就是模型下载太慢。直接ollama run qwen2.5的时候,那个进度条卡在 50% 不动,急也没用。这里给出两条路子:

第一种,设置镜像源地址,以 macOS/Linux 为例,编辑环境变量文件:

# 编辑 ~/.zshrc 或 ~/.bashrc # 找一套国内可用的镜像源地址,替换下面的示例即可 export OLLAMA_HOST="127.0.0.1:11434" # 例如 registry.ollama.ai 太慢时,可以配置为国内镜像域名 export OLLAMA_MODELS="/Users/你的用户名/.ollama/models"

配置完后执行:

source ~/.zshrc # 重启 ollama 服务使环境变量生效 ollama serve

Windows 用户通过“系统属性 -> 环境变量”设置OLLAMA_MODELS,再在命令行里重启ollama appollama serve即可。

第二种更稳的方式:手动下载模型文件(GGUF 格式),然后通过ollama create从本地导入。先去 Hugging Face 搜对应模型的 GGUF 版本,下载到本地后写一个Modelfile

FROM ./qwen2.5-7b-instruct-q4_k_m.gguf

然后在同目录执行:

ollama create qwen2.5-local -f Modelfile

这样完全绕开官方仓库。这个知识点值得记一下,因为内网环境下部署离线模型几乎全靠这套操作。

2.3 模型选型逻辑:按任务类型而不是按参数规模

很多人上来就拉 70B 那种大模型,然后发现电脑根本带不动。正确的选型逻辑是按任务类型来的:

  • 中文写作、闲聊、翻译:首选 Qwen2.5 系列或 GLM 系列,中文语料训练充分,7B 或 14B 就相当能打;
  • 代码生成、补全:DeepSeek-Coder 系列是专门针对代码的,同参数量下代码能力比通用模型强一截;Qwen2.5-Coder 也是不错的选择;
  • 英文为主的指令任务:Llama 3.x 系列最稳,社区生态大,兼容性最好;
  • 检索增强、工具调用:Phi 这类小模型响应快,适合做 Agent 的推理内核。

再补一句关于“量化版本”的概念:同样一个 7B 模型,有 Q2、Q4、Q8、FP16 多个版本,后面的数字代表权重的精度。Q4_K_M 是实用性和体积的平衡点,日常用这个就行。肉眼几乎感知不到和满精度模型的差距,但显存占用能少一半以上。

3. 核心机制拆解:Ollama 的 HTTP API 到底长什么样

模型跑起来以后,Ollama 会默认在127.0.0.1:11434开一个 HTTP 服务。这整个部分是整个教程性价比最高的内容——搞懂这里的接口结构,前端接入就是水到渠成的事。

3.1 服务端口与常用端点

先明确一个概念:Ollama 不是一个给普通用户聊天用的 App,它是一个后台服务,类似你本地装了一个 MySQL 或者 Redis,程序通过端口去访问它。

可以通过浏览器或 curl 访问http://127.0.0.1:11434来验证服务,它可能会返回一个提示信息页。测试服务是否正常,可以请求根路径:

curl http://127.0.0.1:11434

Ollama 提供的主要 API 端点可以整理成下面这个表格:

端点作用前端常用场景
GET /api/tags列出本地已安装的模型列表前端启动时拉取可选模型
POST /api/generate输入 prompt 生成补全内容(非对话式)文本生成、续写
POST /api/chat传入消息数组进行多轮对话聊天机器人、智能助手
POST /api/embed将文本转为向量表示接入知识库做向量检索
GET /api/ps查看当前加载模型与显存占用运维监控面板

前端项目里最常用的一定是/api/chat。配上流式输出,就有了 ChatGML 那种逐字回复的效果。

3.2 请求参数详解:stream、messages、options

单独拿/api/chat出来说,因为它的结构最核心。一个基础请求体长这样:

{ "model": "qwen2.5:7b", "messages": [ {"role": "system", "content": "你是一个严谨的技术助手,回答尽量简洁直接。"}, {"role": "user", "content": "用三句话解释什么是REST API"} ], "stream": false }

要理解几个关键参数背后的意图:

  • stream决定返回方式。false时整个结果一次性返回,适合简单后端逻辑;true时 SSE 流式逐 token 返回,适合前端对话体验。
  • messages从字段名就能看出来,这是多轮对话设计,前端需要把历史消息一起发送,模型才有上下文记忆能力。
  • options里可以设置temperaturenum_predicttemperature控制随机性,代码生成建议 0.2,文学创作建议 0.8;num_predict限制最大生成 token 数,防止模型失控输出长篇大论。

结合这两个参数,真实请求体可以写成:

{ "model": "qwen2.5:7b", "messages": [ {"role": "system", "content": "你是一个代码评审助手,先说问题,再给修改建议。"}, {"role": "user", "content": "看看这段代码有什么问题:def f(x): return x + 1"} ], "stream": true, "options": { "temperature": 0.2, "num_predict": 2048 } }

3.3 响应结构解析:普通模式与流式模式

非流式响应(stream: false)结构相对清晰:

{ "model": "qwen2.5:7b", "created_at": "2025-01-01T12:00:00.000Z", "message": { "role": "assistant", "content": "REST API 是一种基于 HTTP 协议的接口设计规范..." }, "done": true, "total_duration": 1234567890, "eval_count": 128 }

流式响应(stream: true)则是一次返回多行 JSON,每行是独立的:

{"model":"qwen2.5:7b","message":{"role":"assistant","content":"REST"},"done":false} {"model":"qwen2.5:7b","message":{"role":"assistant","content":" API"},"done":false} {"model":"qwen2.5:7b","message":{"role":"assistant","content":" 是"},"done":false} {"model":"qwen2.5:7b","message":{"role":"assistant","content":"","done":true,"total_duration":1234567890}

这里有一个前端非常容易掉坑的点:donetrue的那一行,message.content通常是空字符串,千万不要把它拼进文本里。判断流是否结束,应该看done字段,而不是 content 是否为空。

动手测试一下,直接 curl 一次流式请求,你会看到终端里像打字机一样逐条输出 JSON,对理解流式机制非常有帮助:

curl -N http://127.0.0.1:11434/api/chat \ -d '{ "model": "qwen2.5:7b", "messages": [{"role": "user", "content": "你好"}], "stream": true }'

配合-N参数是为了禁用 curl 的缓冲,让内容实时打出来。

4. 前端接入实战:从 fetch 封装到流式对话

接口明白了,下面就到了正文高潮——前端怎么把 Ollama 这个本地服务真正用起来。

4.1 最基础的接入方案:非流式 fetch

先说最简单的场景:你已经有一个 web 项目,想给页面加一个 AI 问答功能,不需要打字机逐字效果。

直接用 fetch 写一个封装:

async function chatWithLocalModel(messages) { const response = await fetch('http://127.0.0.1:11434/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'qwen2.5:7b', messages: messages, stream: false }) }); if (!response.ok) { throw new Error(`本地模型服务异常,状态码:${response.status}`); } const data = await response.json(); return data.message.content; } // 使用示例 const answer = await chatWithLocalModel([ { role: 'user', content: '写一段冒泡排序的 JavaScript 代码' } ]); console.log(answer);

这套代码跑通以后,你至少有两条经验是确定的:Ollama 服务返回的是标准 JSON,content 就是模型回复文本;不传 system 消息也能正常工作,但加了系统设定后效果会稳定许多。

补充一下,如果希望返回结果带 Markdown 格式(代码、列表),直接输出就能被 Markdown 渲染器处理,Ollama 的模型天然具备 Markdown 输出习惯。

4.2 流式对话实现的完整代码

要做出“打字机效果”,就得处理前端的流式读取,核心是用ReadableStream

async function chatStream(messages, onToken, onDone, onError) { try { const response = await fetch('http://127.0.0.1:11434/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'qwen2.5:7b', messages: messages, stream: true }) }); if (!response.ok) throw new Error(`HTTP ${response.status}`); const reader = response.body.getReader(); const decoder = new TextDecoder('utf-8'); let buffer = ''; while (true) { const { done, value } = await reader.read(); if (done) break; buffer += decoder.decode(value, { stream: true }); // Ollama 每个 chunk 以 \n 分隔,可能一次读入多行 const lines = buffer.split('\n'); buffer = lines.pop(); // 最后一行可能不完整,留到下一次 for (const line of lines) { if (line.trim() === '') continue; const json = JSON.parse(line); if (json.done) { if (onDone) onDone(json); return; } if (json.message && json.message.content) { onToken(json.message.content); } } } } catch (err) { if (onError) onError(err); } }

这里buffer的设计包含一个重要的技术细节:网络传输是按字节分块的,一个完整的 JSON 行可能被拆成两半到达,也可能一个 chunk 携带多条 JSON。所以必须用split('\n')切分,并且把最后一段残留缓存起来等下一轮拼完整。

前端页面上调用时,onToken回调里做的事情就是把 token 追加到显示区域:

// 省略了 React/Vue 的模板代码,核心逻辑就这三行 let answerText = ''; chatStream( messages, (token) => { answerText += token; document.querySelector('#answer').textContent = answerText; }, () => console.log('生成完成') );

理论上如果content为空且donefalse,直接忽略就好,不需要上抛。这也是实际使用中常见的边界情况。

4.3 绕不过去的跨域问题与解决方案

上面的代码如果直接在浏览器环境跑,大概率先遇到一个问题:跨域。浏览器安全策略会禁止从http://localhost:8080的页面直接 fetchhttp://127.0.0.1:11434

最省事的一招:给 Ollama 设置环境变量,允许任意来源跨域:

export OLLAMA_ORIGINS="*"

然后重启ollama serve。这个变量的含义就是放开 CORS 限制,适合纯本地开发调试。

生产环境中更推荐的方案是“同源代理”:前端只请求自己的域名,后端用 Node/nginx 把/api/chat转发到127.0.0.1:11434,浏览器无感知。

用 Node 写一个非常简单的转发服务:

import express from 'express'; import { createProxyMiddleware } from 'http-proxy-middleware'; const app = express(); app.use( '/api', createProxyMiddleware({ target: 'http://127.0.0.1:11434', changeOrigin: true, pathRewrite: { '^/api': '' } // 去掉 /api 前缀再转发 }) ); app.listen(3000);

前端就只需要请求http://你的域名/api/chat,没有跨域风险,以后换成云端模型,也只需要改代理目标,前端代码一行不用动。

4.4 超时、重试与模型未加载的处理

Ollama 有个特点:如果模型第一次被调用,需要先加载进显存,这个时间可能长达数十秒。前端不适配就会表现为“请求挂起很久然后报超时”。

处理方式是在 fetch 中传入 AbortController:

const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), 120000); try { const response = await fetch(url, { method: 'POST', signal: controller.signal, // ...其他配置 }); } catch (err) { if (err.name === 'AbortError') { console.log('请求超时'); } } finally { clearTimeout(timeout); }

另外,模型不存在时 Ollama 会返回 404 和明确的错误信息。前端弹窗提示“请先安装模型”要比直接显示网络报错友好得多。

5. 从“能跑”到“好用”:性能优化与避坑实录

接口通了、前端能显示了,这只是第一层。接下来说说我自己实际运维中踩过的坑和调优经验,这部分内容基本是文档里很难一次性看全的。

5.1 加载速度慢与 keep_alive 参数

每次对话如果都让模型重新加载,体验会让人崩溃。Ollama 默认模型在内存/显存中驻留 5 分钟(keep_alive默认值),超过时间就自动卸载。把keep_alive调大能减少重复加载:

{ "model": "qwen2.5:7b", "messages": [], "stream": true, "keep_alive": "30m" }

这里有两个实际经验值:如果是个人开发,建议直接设成-1(永久驻留),反正下次开机也会清空;如果是多人共用的服务器,设 30 分钟比较平衡,避免内存一直被占着耗电。

判断当前有哪些模型常驻,用这个命令:

ollama ps

输出会显示模型名称、大小、驻留到期时间。如果显示5 minutes但你明明调了keep_alive,先确认 Ollama 服务重启过没有。

5.2 并发请求:降低首 token 延迟的 OLLAMA_NUM_PARALLEL

Ollama 默认一个模型同时只能处理一个请求,第二个请求会排队。这在前端页面同时打开多个浏览器标签测试时会很明显——一个回答在生成,另一个必须等着。

通过环境变量调整并行数量:

export OLLAMA_NUM_PARALLEL=4 export OLLAMA_MAX_LOADED_MODELS=2

这里出现了另一个实践上的“为什么”:并行数不是越大越好。模型并行处理多个请求时,Ollama 会把一个更大的批次塞给 GPU,虽然整体吞吐提升了,但每个请求的首 token 延迟也会变高。真正合适的值取决于你 GPU 的剩余显存和具体业务场景。如果是对话机器人,2~4 是比较合理的区间。

5.3 共享库冲突问题:ollama 命令找不到的排查思路

我遇到过一种情况:明明ollama serve服务在跑,前端却一直报 404。查下来是装了多个 Python 版本的机器上,Ollama 依赖的某些动态库被覆盖了。具体表现可能是命令行还能用,但 API 端点整体异常。

排查链路一般是:

  1. 先 curl 本地端口,确认是不是服务本身问题;
  2. 查看 Ollama 日志(macOS 上在~/.ollama/logs/server.log,Linux 上一般在 journalctl 里);
  3. 如果日志里出现库文件相关报错,考虑重新安装 Ollama 或检查/usr/local/lib下有没有其他软件覆盖了同名.so文件。

这类问题的共同经验是:不要一上来就重装系统或重装 Ollama,先把日志打开看 30 秒,很多问题的答案都在里面。

5.4 嵌入式场景与向量检索:不止于对话

Ollama 的另一大用途是给本地知识库做向量化。前端要构建 RAG 应用时,先用/api/embed把文档切成块并转为向量,再存到向量数据库里;查询时同样先转 User Query 的向量,用余弦相似度检索相关片段,最后把片段塞进 chat 的上下文里。

下面这段是用 JavaScript 请求 embed 端点的例子:

const response = await fetch('http://127.0.0.1:11434/api/embed', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'nomic-embed-text', input: '要检索的文本内容' }) }); const data = await response.json(); console.log(data.embeddings[0]); // 一个一维数组,就是向量

这段代码很适合前端去配合向量数据库使用。不过在本地机器上直接检索大量文档,对内存的消耗也不小,索引构建务必放在定时任务里,不要在页面请求里去动态构建。

5.5 硬件资源满负载时的兜底方案

最后补一个大多数教程不会提的点:如果模型请求量上来后,Ollama 服务突然不响应,不要只想着加显卡。先检查是不是 OLLAMA_MAX_LOADED_MODELS 配置太大了,导致多个大模型同时驻留显存被撑爆;再检查 CPU 推理时是不是环境变量忘了限制线程数:

export OLLAMA_NUM_THREADS=8

这个变量能限制推理时的 CPU 线程数,防止 Ollama 把整台机器所有核心吃满,影响同机部署的数据库或者前端构建服务。实测下来,设成物理核心数的一半,推理速度几乎不受影响,但整机稳定性能明显提升。

6. 前端本地调用之外的几个进阶方向

接口已经通了、性能也调优了,这个项目还能往哪走?我把自己试过的三个方向列一下,给有兴趣继续深入的朋友做个参考。

6.1 对接 OpenAI SDK 生态

很多现成的开源前端项目(比如各种 ChatUI 组件、Agent 框架)默认是面向 OpenAI API 写的。Ollama 从 0.1.24 版本开始兼容 OpenAI 的接口规范,只要把 SDK 的 baseURL 指到 Ollama 的/v1路径,就能直接复用。

用 Node.js 的 openai 库举例:

import OpenAI from 'openai'; const client = new OpenAI({ baseURL: 'http://127.0.0.1:11434/v1', apiKey: 'ollama' // 本地服务随便填,但字段不能少 }); const response = await client.chat.completions.create({ model: 'qwen2.5:7b', messages: [{ role: 'user', content: '前端要怎么学才高效?' }], stream: true }); for await (const chunk of response) { process.stdout.write(chunk.choices[0]?.delta?.content || ''); }

代码不变、只改 baseURL 就能接入本地模型,这是 Ollama 生态最聪明的一步棋。以后你的前端要切回云端 API(比如用 DeepSeek 官方 API 或 OpenAI),代码几乎零成本迁移。

6.2 用 Docker 部署 Ollama 服务

如果是部署在服务器上,我建议直接用 Docker 跑,好处是隔离环境、方便迁移。

docker run -d \ --name ollama \ --gpus all \ -v ollama_models:/root/.ollama \ -p 11434:11434 \ ollama/ollama:latest

注意-v挂载这个点:模型库文件必须持久化在宿主机上,否则容器删除后模型全部丢失。部署完以后,进入容器拉模型:

docker exec -it ollama ollama pull qwen2.5:7b

这样主机和 Docker 内部的端口映射就打通了。前端访问方式和本地安装完全一样,不用改任何代码。我自己在服务器上的习惯做法就是这种,宿主机只暴露 11434,其他端口一律不向外开,安全性和稳定性都有保障。

6.3 前端应用里如何管理会话上下文

前端接入不只是发一次请求就结束。你要考虑多轮对话的记忆问题。最简单的方案是前端维护messages数组,每轮对话把历史消息一起发给 Ollama。但无限制地累积消息,会越来越占上下文长度,响应速度也会明显变慢。

我常用的做法是:超过一定轮数后,把最早的消息裁剪掉;system prompt 永远保持在数组第一位;如果有摘要能力,可先把早期对话压缩成摘要再塞回上下文。这套逻辑我简单封装成了一个函数:

function buildContext(history, systemPrompt, maxTurns = 10) { const recent = history.slice(-maxTurns * 2); // 每轮一问一答,乘2 return [ { role: 'system', content: systemPrompt }, ...recent ]; }

这个buildContext会在每轮请求前生成新的上下文数组。直观的价值是:前端内存占用可控,模型不会被几十轮历史消息拖慢。

从一个工具类项目变成可长期使用的生产力工具,往往就差这类细节。

我自己用了 Ollama 接近一年,最大的感受是:一旦本地模型跑通了 API,前端的想象空间就完全打开了——不需要等待云端审核、不需要担心额度、不需要处理复杂的鉴权。曾经“AI 功能”是所有前端项目里最遥不可及的一部分,现在它已经变成了像调setTimeout一样的常规操作。你完全可以在自己的个人站点上加一个本地模型驱动的评论助手,或者在公司内网搭一个文档问答机器人。

如果你照着这篇文章把链路走通了一遍,后面大概率会主动去研究量化精度选择、RAG 召回策略、GPU 并行调优这些更深入的东西。那就对了,这条路我走过,值得走。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 1:49:39

PP-MattingV2 ONNX Runtime WinForms部署:实现高性能抠图

简介:面向 C# 桌面应用开发者,提供在 WinForm 中部署 PP-MattingV2 人像抠图 ONNX 模型的完整源码工程。项目基于 VS2019、.NET Framework 4.7.2,结合 OpenCvSharp4.8.0 与 ONNX Runtime 1.16.3 完成模型推理与图像处理,适合需要快…

作者头像 李华
网站建设 2026/9/14 1:47:53

BDS/GPS双模单点定位C语言实现与RINEX解析

简介:本资源是一套基于Visual Studio 2010开发的北斗卫星导航系统(BDS)单点定位C语言实现程序,面向GNSS导航算法学习者、测绘与地理信息专业学生及嵌入式定位开发初学者,用于理解伪距观测、坐标解算、误差修正等单点定…

作者头像 李华
网站建设 2026/9/14 1:43:10

基于微信小程序的设备故障报修系统:SSM框架实践

简介:一套基于微信小程序与SSM框架(SpringSpring MVCMyBatis)完成的设备故障报修管理系统项目源码,面向计算机相关专业毕业设计、课程设计以及需要快速搭建内部报修平台的技术开发者。系统覆盖设备台账管理、故障单提交、维修任务…

作者头像 李华
网站建设 2026/9/14 1:41:56

Hive拉链表设计与实现:数据仓库历史追踪方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华