Angular + Node.js + MySQL 前后端数据交互实战:从数据库到页面渲染
1. 项目缘起与整体架构思路1.1 为什么选 Angular Node.js MySQL 这套组合这个项目标题乍一看像是教科书里的标准案例但真正动手做过前后端打通的人都知道从数据库到浏览器页面之间那条链路坑远比想象中多。我选择 Angular 作为前端框架、Node.js 作为服务端、MySQL 作为数据存储这套组合在实际项目中出现的频率非常高尤其适合中小型管理系统、内部工具、数据看板这类场景。Angular 的优势在于它自带完整的依赖注入、路由、HTTP 客户端、表单验证等能力不需要像 React 那样到处挑第三方库拼装。对于从数据库读取数据并渲染到页面这种典型需求Angular 的 HttpClient 模块配合 RxJS 的 Observable 流式处理能让数据请求和状态管理变得非常清晰。Node.js 这边Express 框架几行代码就能起一个 RESTful 接口mysql2 驱动对连接池和预处理语句的支持也很成熟。MySQL 作为关系型数据库在结构化数据存储上的稳定性和查询灵活性无需多言。这套架构的核心数据流向是这样的Angular 组件发起 HTTP 请求Node.js 服务端接收请求后通过 mysql2 连接池查询 MySQL将结果以 JSON 格式返回Angular 再通过数据绑定渲染到模板上。整条链路涉及跨域配置、连接池管理、异步处理、错误捕获、类型定义等多个技术点每一个环节都有值得展开的细节。1.2 项目整体结构设计在动手写代码之前先把目录结构规划清楚后面维护起来会轻松很多。我通常会把前后端放在同一个仓库的不同目录下方便统一管理依赖和版本。project-root/ ├── client/ # Angular 前端项目 │ ├── src/ │ │ ├── app/ │ │ │ ├── services/ # HTTP 服务层 │ │ │ ├── models/ # 数据接口定义 │ │ │ ├── components/ # 页面组件 │ │ │ └── app.module.ts │ │ ├── environments/ # 环境配置 │ │ └── main.ts │ ├── angular.json │ └── package.json ├── server/ # Node.js 服务端 │ ├── src/ │ │ ├── routes/ # 路由定义 │ │ ├── controllers/ # 业务逻辑 │ │ ├── db/ # 数据库连接与查询 │ │ └── app.js │ ├── .env # 环境变量 │ └── package.json └── README.md前端用 Angular CLI 生成项目骨架服务端用 Express 手动搭建。两边各自独立启动开发阶段前端跑在 4200 端口服务端跑在 3000 端口通过代理配置解决跨域问题。这种分离式结构的好处是前后端可以独立开发、独立部署前端构建产物可以直接扔到 Nginx 或 CDN 上服务端则部署到应用服务器。注意不要把 Angular 的构建产物和服务端代码混在一起部署除非你明确知道自己在做什么。分离部署在扩展性和维护性上都更优。1.3 数据库表设计与初始化既然是“从 MySQL 读取数据”那得先有数据。我设计一张简单的用户信息表作为示例涵盖常见的字段类型和查询场景。CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, age INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO users (username, email, age) VALUES (张三, zhangsanexample.com, 28), (李四, lisiexample.com, 32), (王五, wangwuexample.com, 25);字符集用 utf8mb4 是为了支持中文和特殊符号引擎选 InnoDB 是为了事务支持和行级锁。这些细节在开发阶段可能感觉不到差异但到了生产环境就是稳定性的分水岭。2. 服务端核心实现与关键细节2.1 Node.js 项目初始化与依赖选型服务端这边我习惯用 Express 作为 Web 框架mysql2 作为数据库驱动dotenv 管理环境变量cors 处理跨域。为什么选 mysql2 而不是 mysql因为 mysql2 原生支持 Promise配合 async/await 写起来非常顺手而且它的连接池实现更完善预处理语句的性能也更好。mkdir server cd server npm init -y npm install express mysql2 cors dotenv npm install -D nodemonnodemon 是开发阶段的利器文件改动后自动重启服务省去手动 CtrlC 再 npm start 的麻烦。在 package.json 里加一行脚本scripts: { dev: nodemon src/app.js, start: node src/app.js }环境变量文件.env里存放数据库连接信息千万不要把这些硬编码到代码里更不要提交到版本控制系统。DB_HOSTlocalhost DB_PORT3306 DB_USERroot DB_PASSWORDyour_password DB_NAMEyour_database PORT30002.2 数据库连接池的配置与原理连接池这个概念用生活化的方式解释就是每次查询都新建一个数据库连接就像每次打电话都重新办一张手机卡成本太高。连接池就是提前办好一批卡放在那里谁需要谁拿去用用完还回来。mysql2 的 createPool 方法就是干这个的。const mysql require(mysql2); require(dotenv).config(); const pool mysql.createPool({ host: process.env.DB_HOST, port: process.env.DB_PORT, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, waitForConnections: true, connectionLimit: 10, queueLimit: 0, charset: utf8mb4 }); const promisePool pool.promise(); module.exports promisePool;connectionLimit: 10表示池子里最多同时存在 10 个连接。这个数字怎么定一个经验公式是连接数 CPU 核心数 × 2 磁盘数。对于大多数中小型应用10 到 20 之间是合理的。设太大了反而会拖垮数据库因为每个连接都占用内存和文件句柄。queueLimit: 0表示不限制等待队列长度当所有连接都在忙时新请求会排队等待而不是直接报错。提示连接池创建后不会立即建立连接而是在第一次查询时才真正连接。所以服务启动时不会因为数据库没准备好而崩溃但第一次请求可能会有轻微延迟。2.3 RESTful 接口设计与路由实现接口设计遵循 RESTful 风格用 HTTP 动词表达操作意图。这里实现两个典型接口获取用户列表和根据 ID 获取单个用户。const express require(express); const cors require(cors); const db require(./db/pool); const app express(); app.use(cors()); app.use(express.json()); // 获取所有用户 app.get(/api/users, async (req, res) { try { const [rows] await db.query(SELECT id, username, email, age, created_at FROM users); res.json({ code: 0, data: rows, message: success }); } catch (err) { console.error(查询用户列表失败:, err); res.status(500).json({ code: 500, data: null, message: 服务器内部错误 }); } }); // 根据 ID 获取用户 app.get(/api/users/:id, async (req, res) { const userId parseInt(req.params.id, 10); if (isNaN(userId)) { return res.status(400).json({ code: 400, data: null, message: 无效的用户 ID }); } try { const [rows] await db.query(SELECT id, username, email, age FROM users WHERE id ?, [userId]); if (rows.length 0) { return res.status(404).json({ code: 404, data: null, message: 用户不存在 }); } res.json({ code: 0, data: rows[0], message: success }); } catch (err) { console.error(查询用户详情失败:, err); res.status(500).json({ code: 500, data: null, message: 服务器内部错误 }); } }); const PORT process.env.PORT || 3000; app.listen(PORT, () { console.log(服务端已启动监听端口 ${PORT}); });这里有几个关键点值得展开。第一db.query的第二个参数用数组传参mysql2 会自动做转义这是防止 SQL 注入的第一道防线。第二返回结构统一为{ code, data, message }前端处理起来逻辑一致不用为每个接口写不同的解析代码。第三错误处理里区分了客户端错误400、404和服务端错误500前端可以根据状态码做不同的提示。2.4 跨域问题的本质与解决方案开发阶段前端跑在 4200 端口服务端跑在 3000 端口浏览器出于同源策略会拦截跨域请求。app.use(cors())这行代码就是在响应头里加上Access-Control-Allow-Origin: *告诉浏览器这个接口允许跨域访问。但生产环境不建议用*而是明确指定允许的来源app.use(cors({ origin: [http://localhost:4200, https://your-domain.com], methods: [GET, POST, PUT, DELETE], credentials: true }));另一种方案是在 Angular 这边配置代理把/api开头的请求转发到服务端这样浏览器看到的是同源请求根本不触发跨域检查。在proxy.conf.json里配置{ /api: { target: http://localhost:3000, secure: false, changeOrigin: true } }然后在angular.json的 serve 配置里加上proxyConfig: proxy.conf.json。两种方案各有优劣cors 方案对前端透明但需要服务端配合代理方案前端配置稍多但服务端不需要关心跨域。我通常两个都配上开发用代理生产用 cors 白名单。3. Angular 前端实现与数据交互3.1 Angular 项目初始化与模块导入用 Angular CLI 创建项目是最省事的方式它会自动生成标准目录结构和配置文件。ng new client --routing --stylescss cd client创建完成后在app.module.ts里导入 HttpClientModule这是发起 HTTP 请求的前提。import { HttpClientModule } from angular/common/http; NgModule({ imports: [ BrowserModule, HttpClientModule, AppRoutingModule ], // ... }) export class AppModule { }Angular 的模块系统是它区别于其他框架的一大特点。HttpClientModule 提供了 HttpClient 服务通过依赖注入的方式在组件或服务中使用。这种设计的好处是测试时可以轻松替换成 Mock 服务不需要改业务代码。3.2 数据模型定义与类型安全TypeScript 的核心价值之一就是类型安全。在models/user.model.ts里定义接口export interface User { id: number; username: string; email: string; age: number; created_at?: string; } export interface ApiResponseT { code: number; data: T; message: string; }定义接口的好处是当你在组件里访问user.username时编辑器会自动补全写错了字段名会立刻报错。这在大型项目里能省下大量调试时间。ApiResponseT用了泛型这样不同接口返回不同数据类型时都能复用同一个响应结构。3.3 HTTP 服务层封装与 RxJS 处理把 HTTP 请求封装到独立的服务里组件只负责展示逻辑这是 Angular 的最佳实践。创建services/user.service.tsimport { Injectable } from angular/core; import { HttpClient } from angular/common/http; import { Observable } from rxjs; import { User, ApiResponse } from ../models/user.model; Injectable({ providedIn: root }) export class UserService { private apiUrl /api/users; constructor(private http: HttpClient) {} getUsers(): ObservableApiResponseUser[] { return this.http.getApiResponseUser[](this.apiUrl); } getUserById(id: number): ObservableApiResponseUser { return this.http.getApiResponseUser(${this.apiUrl}/${id}); } }Injectable({ providedIn: root })表示这个服务是单例的整个应用共享一个实例。RxJS 的 Observable 是 Angular 处理异步数据的核心抽象它比 Promise 更强大支持取消、重试、组合等操作。虽然对于简单的 HTTP 请求来说Observable 和 Promise 用起来差不多但当你需要做请求防抖、轮询、错误重试时RxJS 的优势就体现出来了。3.4 组件中的数据订阅与模板渲染组件这边在ngOnInit生命周期钩子里发起请求把返回的数据赋值给组件属性模板通过数据绑定自动更新。import { Component, OnInit, OnDestroy } from angular/core; import { Subject, takeUntil } from rxjs; import { UserService } from ../services/user.service; import { User } from ../models/user.model; Component({ selector: app-user-list, templateUrl: ./user-list.component.html, styleUrls: [./user-list.component.scss] }) export class UserListComponent implements OnInit, OnDestroy { users: User[] []; loading false; errorMessage ; private destroy$ new Subjectvoid(); constructor(private userService: UserService) {} ngOnInit(): void { this.loadUsers(); } loadUsers(): void { this.loading true; this.errorMessage ; this.userService.getUsers() .pipe(takeUntil(this.destroy$)) .subscribe({ next: (res) { if (res.code 0) { this.users res.data; } else { this.errorMessage res.message; } this.loading false; }, error: (err) { this.errorMessage 网络请求失败请稍后重试; this.loading false; console.error(获取用户列表失败:, err); } }); } ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } }这里用takeUntil(this.destroy$)是为了在组件销毁时自动取消未完成的订阅防止内存泄漏。这是 Angular 项目里非常容易被忽略的一个点尤其是当用户快速切换页面时未取消的订阅会导致回调在已销毁的组件上执行轻则报错重则引发难以排查的 bug。模板文件user-list.component.htmldiv classuser-list h2用户列表/h2 div *ngIfloading classloading加载中.../div div *ngIferrorMessage classerror{{ errorMessage }}/div table *ngIf!loading !errorMessage users.length 0 thead tr thID/th th用户名/th th邮箱/th th年龄/th /tr /thead tbody tr *ngForlet user of users td{{ user.id }}/td td{{ user.username }}/td td{{ user.email }}/td td{{ user.age }}/td /tr /tbody /table div *ngIf!loading !errorMessage users.length 0 classempty 暂无数据 /div /div模板里用*ngIf处理了四种状态加载中、出错、有数据、无数据。这四种状态在实际项目中缺一不可很多新手只写了“有数据”的情况结果网络慢的时候页面一片空白用户以为系统坏了。4. 常见问题排查与实战避坑指南4.1 数据库连接失败的五种典型原因数据库连不上是新手遇到的第一道坎我把常见原因整理成一张速查表。现象可能原因排查方法ECONNREFUSEDMySQL 服务未启动检查服务状态确认端口监听ER_ACCESS_DENIED_ERROR用户名或密码错误用命令行客户端验证凭据ER_BAD_DB_ERROR数据库不存在执行 SHOW DATABASES 确认ETIMEDOUT防火墙拦截或地址错误检查 host 配置和网络连通性ER_NOT_SUPPORTED_AUTH_MODE认证插件不兼容调整用户认证方式或升级驱动我踩过最坑的一次是本地 MySQL 装了新版默认认证插件变了mysql2 旧版本连不上报的错还很隐晦。后来升级 mysql2 到最新版就解决了。所以依赖包的版本不要锁太死定期更新能避免很多兼容性问题。4.2 跨域报错的三种表现与对应解法跨域问题的报错信息在浏览器控制台里长得都差不多但原因可能不同。第一种是简单请求被拦截控制台显示No Access-Control-Allow-Origin header。这种最好解决服务端加上 cors 中间件即可。第二种是预检请求失败浏览器先发一个 OPTIONS 请求服务端没有正确处理。Express 的 cors 中间件默认会处理 OPTIONS但如果你自定义了路由中间件可能会拦截掉。确保app.use(cors())放在所有路由之前。第三种是带凭证的请求前端设置了withCredentials: true服务端却返回Access-Control-Allow-Origin: *。这种情况下浏览器会拒绝响应因为通配符不允许携带凭证。解法是服务端明确指定来源不能用*。注意跨域是浏览器的安全机制不是服务端的限制。用 Postman 测试接口正常不代表浏览器里也正常排查时一定要看浏览器控制台的完整报错。4.3 Angular 数据绑定不更新的排查思路有时候接口返回了数据但页面就是不变。这种情况我遇到过好几次原因各不相同。最常见的是在订阅回调里用了this但上下文丢失了。如果用普通函数而不是箭头函数this指向会变。箭头函数没有自己的this会捕获外层的上下文所以订阅回调一律用箭头函数。另一种情况是数据变了但 Angular 没检测到。Angular 的变更检测机制在大多数情况下能自动工作但如果你在setTimeout或第三方库的回调里修改了数据可能需要手动触发。可以注入ChangeDetectorRef并调用detectChanges()。不过这种情况在现代 Angular 里越来越少因为默认策略已经足够智能。还有一种隐蔽的情况是接口返回的数据结构和模板里访问的字段不匹配。比如接口返回{ data: { list: [...] } }模板里却写的是users那自然渲染不出来。用console.log打印完整响应结构对照模板里的字段名逐一核对基本都能定位。4.4 连接池耗尽与查询性能问题服务跑一段时间后接口变慢甚至超时大概率是连接池被占满了。原因通常是某个查询没有正确释放连接或者慢查询把连接都占住了。mysql2 的pool.query方法会自动释放连接但如果你用pool.getConnection()手动获取连接就必须在 finally 块里调用connection.release()。我见过有人忘了释放跑了几百个请求后服务就卡死了。const connection await pool.getConnection(); try { const [rows] await connection.query(SELECT * FROM users); return rows; } finally { connection.release(); }慢查询的排查可以用 MySQL 的慢查询日志或者在代码里加计时const start Date.now(); const [rows] await db.query(sql); console.log(查询耗时: ${Date.now() - start}ms);如果发现某条查询经常超过 100ms就要考虑加索引了。用EXPLAIN分析执行计划看看有没有全表扫描。5. 从开发到部署的完整链路5.1 开发环境联调的最佳实践开发阶段我习惯同时开三个终端一个跑 MySQL一个跑 Node 服务端一个跑 Angular 开发服务器。用nodemon和ng serve都能自动热重载改完代码保存就能看到效果。联调时最容易出问题的是接口地址。前端代码里写/api/users通过代理转发到 3000 端口。如果代理配置没生效请求会打到 4200 端口返回 404。排查方法是打开浏览器开发者工具的 Network 面板看请求的实际 URL 和响应状态。另一个建议是在服务端加一个健康检查接口app.get(/api/health, (req, res) { res.json({ status: ok, timestamp: new Date().toISOString() }); });前端启动时先调这个接口确认服务端可达再加载数据。这样用户看到的是“服务连接中”而不是莫名其妙的空白页。5.2 生产环境部署要点生产部署时Angular 用ng build --configuration production构建产物在dist/client目录下。这些静态文件可以放到 Nginx 的 html 目录配置一个 location 指向 index.html 处理前端路由。Node 服务端用 pm2 守护进程管理pm2 start src/app.js --name api-server。pm2 会在进程崩溃时自动重启还能做负载均衡和日志管理。数据库这边生产环境一定要用独立的数据库用户只授予必要的权限不要用 root 跑应用。密码要足够复杂并且定期轮换。CREATE USER app_user% IDENTIFIED BY strong_password_here; GRANT SELECT, INSERT, UPDATE, DELETE ON your_database.* TO app_user%; FLUSH PRIVILEGES;Nginx 配置里把/api的请求反向代理到 Node 服务location /api { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }这样前端和后端在同一个域名下跨域问题自然消失也不需要 cors 中间件了。5.3 安全加固的几个关键点除了 SQL 注入防护还有几个安全细节值得注意。请求体大小限制Express 默认是 100kb对于大多数接口够用但如果要上传文件就得调整。app.use(express.json({ limit: 1mb }))。错误信息不要直接返回给前端尤其是数据库报错。生产环境应该记录完整错误到日志只返回通用的错误提示。否则攻击者可以通过报错信息推断数据库结构。接口加频率限制防止暴力请求。可以用 express-rate-limit 中间件简单几行配置就能挡住大部分恶意流量。const rateLimit require(express-rate-limit); const limiter rateLimit({ windowMs: 15 * 60 * 1000, max: 100, message: { code: 429, message: 请求过于频繁请稍后再试 } }); app.use(/api/, limiter);这套前后端交互的链路从数据库到页面涉及的技术点确实不少。但把每个环节拆开来看无非就是连接、查询、传输、渲染这四步。真正花时间的不是写代码而是排查那些意料之外的报错。我个人的经验是遇到问题先看日志服务端日志看数据库报错浏览器控制台看网络请求两边对照着看大部分问题都能快速定位。剩下那些偶发的、难以复现的问题往往和连接池、异步时序、变更检测这些底层机制有关需要多花点耐心去理解原理。

相关新闻

易语言EIP注入实战:永久劫持与稳定性优化

易语言EIP注入实战:永久劫持与稳定性优化

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

2026/10/14 1:35:09 阅读更多 →
CTF密码学从入门到实战:编码识别、古典密码与现代密码攻击全解析

CTF密码学从入门到实战:编码识别、古典密码与现代密码攻击全解析

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

2026/10/14 1:35:09 阅读更多 →
易语言大漠多线程启动模板:架构设计与踩坑实战

易语言大漠多线程启动模板:架构设计与踩坑实战

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

2026/10/14 1:35:09 阅读更多 →

最新新闻

LaTeX 2025环境配置:texlive + TeXstudio

LaTeX 2025环境配置:texlive + TeXstudio

文章目录Latex2025环境配置一、LaTeX 简介1.1 什么是 LaTeX?1.2 为什么使用 LaTeX?1.3 如何开始使用 LaTeX?二、texlive下载安装2.1 texlive下载2.2 texlive安装2.3 常见问题2.3.1 用管理员权限打开install-tl-windows.bat 报错2.3.2 Latex安…

2026/10/14 2:20:23 阅读更多 →
从工勘图到资源库:提交 nVisual Studio 与机房设计全生命周期的闭环

从工勘图到资源库:提交 nVisual Studio 与机房设计全生命周期的闭环

从工勘图到资源库:提交 nVisual Studio 与机房设计全生命周期的闭环摘要:工勘图纸的价值在「进入可检索、可复用资源库」之后才被放大——本地文件解决现场与交付,平台解决长期资产。DCDesigner 的「提交 nVisual Studio」把工勘 JSON 一键回…

2026/10/14 2:20:23 阅读更多 →
因果推断教材实战:从AB实验到双重机器学习与策略学习

因果推断教材实战:从AB实验到双重机器学习与策略学习

简介:这份资源是斯坦福大学Stefan Wager于2024年9月更新的《Causal Inference: A Statistical Learning Approach》教科书草稿,面向数据科学、统计学、经济学与公共政策领域的学习者和研究者,帮助其系统掌握基于统计学习方法的因果推断理论与…

2026/10/14 2:20:23 阅读更多 →
游集美Day1:逛完学村走老巷,被这几家街坊常来的小店拦住了脚步

游集美Day1:逛完学村走老巷,被这几家街坊常来的小店拦住了脚步

很多人来集美,打卡完嘉庚建筑、龙舟池,拍几张照片就匆匆返程。 但集美真正动人的烟火,不在网红打卡点,藏在黄昏的社区老巷。 这条路线我按地理位置理顺,不跨区乱跑,骑行顺路,慢逛无赶路压力&…

2026/10/14 2:20:23 阅读更多 →
系统辨识实战教案:M序列设计、RLS实现与工业白化检验

系统辨识实战教案:M序列设计、RLS实现与工业白化检验

简介:本资源是一份面向自动化专业本科生与研究生的《系统辨识》课程教案,聚焦工程建模核心能力培养,解决从实际系统数据中构建可用数学模型的关键问题。教案覆盖实体与模型本质辨析、Zadeh三要素(数据/模型类/准则)理论…

2026/10/14 2:20:23 阅读更多 →
AI 辅助科研溯源闸门:输入·命令·决策·证据四类记录的失败含义与当天最小实验

AI 辅助科研溯源闸门:输入·命令·决策·证据四类记录的失败含义与当天最小实验

千笔-AIWritePaper https://www.aiwritepaper.com Agent 能很快从原始表跑出一张宇宙学风格的斜率图,不等于结果可审查。缺了输入校验和,文件可以被静默替换;命令行事后改参,YAML 里仍写着旧参数;决策条目没有理由&am…

2026/10/14 2:19:23 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →