news 2026/9/26 13:36:52

微信小程序健身管理系统开发实战:从技术选型到部署上线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微信小程序健身管理系统开发实战:从技术选型到部署上线

1. 项目整体设计与技术选型

1.1 核心需求拆解:健身管理到底管什么

先说个结论:很多人听到“健身管理系统”第一反应是“做个课程表加个预约功能”,这个理解太浅了。真正跑过业务的人会告诉你,健身管理的核心痛点有三个:会员管理、教练排课、课程履约,这三件事环环相扣,缺一个就转不起来。

我以前帮朋友的小健身房做过需求梳理,发现真实场景里最挠头的是“老会员带着朋友来体验课,前台用Excel查半天有没有空位”,还有“教练临时请假,一群会员在群里问今天课还上不上”。所以做这个系统,第一件事不是写代码,而是把角色理清楚:会员要能看课、约课、打卡、查记录;教练要能排课、看自己的课表、管理学员;管理员要能审核教练、统计营收、处理异常预约。微信小程序天然适合这个场景——用户不用下载App,点开就用,用完就走,预约、取消、查记录这类轻操作体验非常好。

这个项目适合谁?两类人最合适:一是做毕业设计或课程设计的学生,二是想低成本验证健身业务的小型健身房老板或独立教练。前者看重技术完整性和论文可写性,后者看重功能可用性和部署成本。我下面讲的方案,两条路都能走通。

1.2 技术选型:为什么我建议原生框架而非uniapp

选型这件事,我见过太多人上来就纠结“用uniapp还是原生”。我的建议很直接:如果核心目标是微信小程序,优先原生WXML+WXSS+JS。原因有三个。第一,小程序的API生态和原生框架契合度最高,什么wx.login、wx.request、wx.getLocation,原生环境里调起来最顺;uniapp虽然能一套代码多端复用,但它在微信端的兼容性坑非常多,比如我踩过的chooseAvatar在部分基础库版本上要求显式声明scope,这种问题排起来非常痛苦。

第二,原生框架的包体更小、启动更快。小程序的包体限制是2MB,超过就得用分包,原生的编译优化更成熟,首屏加载体感明显更好。第三,如果你要写毕业论文,原生框架的实现思路更容易讲清楚,代码也更直观,导师看不懂uniapp的语法层抽象不如直接看原生逻辑清楚。

但有一类情况我建议用uniapp:你未来想把同一套业务发布到支付宝小程序或App端,或者团队里其他成员只熟悉Vue语法。如果你属于这种场景,选uniapp不冤。这里我只提醒一句:务必先在微信开发者工具里真机调试几天再决定,别写完一半才回头换。

再说云开发。这两年微信云开发(CloudBase)确实火,免运维、自带数据库和云函数,对新手极其友好。但我的观点很明确:健身管理系统这种场景,业务逻辑虽然不复杂,但涉及多表关联、定时任务、权限控制,自建后端(Node.js/Java/PHP)的可控性远高于云开发。云开发适合原型验证,不适合做正式交付——你想导出数据做分析都费劲,第三方服务接入还得绕一圈。所以下面的方案我按“原生小程序 + 自建后端API + MySQL”来讲,这个组合最稳妥也最主流。

2. 数据库设计与接口规划

2.1 数据表设计:健身场景的核心实体关系

数据库是这类系统的命根子,我见过很多半途而废的项目,十有八九是表设计拉胯,写到后面前后端互相“打架”。我把核心表列出来,你直接拿着用就行。

表名用途关键字段
user会员信息id, openid, nickname, avatar, phone, gender, height, weight, create_time
coach教练信息id, user_id, real_name, title, intro, years_exp, avatar, status
course课程id, coach_id, name, type(私教/团课/操课), duration, max_students, price, cover, description
schedule排课id, course_id, coach_id, start_time, end_time, capacity, booked_count, status(未开始/进行中/已结束)
booking预约记录id, user_id, schedule_id, coach_id, status(已预约/已取消/已完成/已爽约), book_time, cancel_time
checkin打卡记录id, user_id, schedule_id, checkin_time, type(签到/训练完成)
payment支付订单id, order_no, user_id, coach_id, schedule_id, amount, status, pay_time
feedback意见反馈id, user_id, content, reply, create_time

别小看 schedule 表里的booked_count,它不是为了省事,而是为了在高并发抢课场景下减少查询压力。会员端约课时,先查booked_count < capacity,再用事务锁行更新,而不是每次都COUNT(*)数预约记录,性能差距在高峰时段非常明显。

用户表里的height和weight很多人会忽略,但健身场景里这两个字段是后续做BMI计算、训练计划推荐的基础。做论文的时候,画ER图,你的核心关系就是:user 与 booking 是一对多,schedule 与 booking 是一对多,coach 与 schedule 是一对多,course 与 schedule 是一对多。这四个关系画清楚,论文的数据层就立住了。

2.2 API接口规划:前后端联调的关键

接口设计我用RESTful风格,统一返回格式:

{ "code": 0, "message": "success", "data": {} }
  • code=0表示成功,非0表示业务异常,前端根据code做统一提示。
  • 登录接口:POST /api/auth/login,入参code(微信登录凭证),后端换成openid后返回token。
  • 课程列表:GET /api/course/list,支持按类型、按教练、按时间过滤。
  • 排课查询:GET /api/schedule/list?date=2025-06-01,返回某天所有可约课程及剩余名额。
  • 预约操作:POST /api/booking/create,入参scheduleId,后端先查排课状态再写预约表。
  • 取消预约:POST /api/booking/cancel,注意要判断开课前多久可以取消。
  • 打卡签到:POST /api/checkin/create,同时校验地理位置是否在健身房附近,这个我用wx.getLocation做了一圈判断。

这里有个容易踩的坑:wx.getLocation在小程序里需要用户授权,而且基础库版本不同,调用的方式有差异。我在 2024 年的版本里就碰到过chooseAvatar要求提前在app.json的permission里声明用途的场景,否则直接报api scope is not declared in the private。这类问题在社区里反馈很多,解决方案就是提前配置好权限声明,别等用户操作到那一步才报错。

2.3 为什么用MySQL而不是MongoDB

我知道现在很多教程推荐MongoDB,说JSON格式方便、不用写SQL。但健身管理系统这种业务,数据一致性比灵活性重要。预约、支付、库存这些操作需要事务支持——比如用户支付成功但预约名额被别人抢了,你必须回滚订单,MySQL的InnoDB事务能帮你兜底,MongoDB的事务虽然也能用,但心智负担和运维成本都更高。另一个理由是:教务系统、会员系统的数据以结构化为主,字段固定、关系明确,用MySQL反而简单直接。你不用被“新技术就是好”的论调带偏,哪个工具顺手就用哪个。

3. 核心功能模块实现细节

3.1 微信登录授权流程

小程序登录靠wx.login拿临时凭证code,后端拿着这个code再到微信的jscode2session接口换取openid和session_key。这一步有两个细节要注意。

第一,code是一次性的,有效期五分钟,后端换完必须立刻用掉,别存库。第二,用户首次进入时,你需要引导他授权手机号,这里我踩过坑——直接调wx.getPhoneNumber会弹授权框,用户很容易拒绝,而且基础库对手机号快速验证组件的限制也在变。我的做法是:先静默登录拿openid,让用户能浏览课程,到预约时才要求绑定手机号。这符合小程序的用户习惯,转化率更高。

另外,openid是用户的唯一标识,但你不能用它当用户名展示,涉及隐私和安全。我会在后端生成一个user_id(自增主键),JWT里只放user_id,前端每次请求带上Authorization头,后端从中间件解析出用户信息。

3.2 预约与取消预约的状态机设计

预约模块是整个系统的核心,状态流转一定不能乱。我梳理成四个状态:已预约 -> 已完成、已预约 -> 已取消、已预约 -> 已爽约。你想象一下真实业务:会员约了晚上7点的私教课,6点50还在路上,结果课程已经开课了,他没有取消也没有到场,系统应该自动标记为“爽约”。爽约次数多了,可以限制他后续的预约权限。

后端实现时,我在booking表里加了status字段和cancel_time字段,同时在schedule表里用事务更新booked_count。伪代码如下:

async function cancelBooking(bookingId, userId) { const booking = await getBookingById(bookingId) // 加行锁 if (!booking || booking.user_id !== userId) throw new Error('预约不存在') if (booking.status !== '已预约') throw new Error('当前状态不可取消') const schedule = await getScheduleById(booking.schedule_id) // 加行锁 if (schedule.start_time - now < 30 * 60 * 1000) { throw new Error('开课前30分钟不可取消') } // 开启事务:更新预约状态 + 名额加回 await updateBookingStatus(bookingId, '已取消') await updateScheduleCount(schedule.id, -1) }

注意:取消时限一般设定为开课前30分钟,太晚取消会导致教练时间空置,对教练不公平。这个规则在设计文档里就要写清楚,论文里也能作为业务亮点单独讲一段。

3.3 视频课程与训练计划模块

不是每个用户都想线下上课,系统里我加了一个“训练视频库”,管理员可以上传教学视频,会员可以点播。小程序的视频播放组件是video,需要注意三点:

  • 视频地址必须存放在稳定CDN上,直接用后端服务器带宽撑不起并发播放。
  • 视频封面图用poster属性搭配binderror事件处理加载失败场景。
  • 如果视频格式是HLS(.m3u8),在Android和iOS上的兼容性不一样,iOS端原生支持,Android部分机型需要特殊处理。我建议直接上传MP4格式,保证双端一致。

训练计划模块可以给会员推荐“周计划”,数据结构很简单:一个计划包含多个训练动作,每个动作有名称、次数、组数、视频演示地址。这个模块虽然逻辑不复杂,但很能撑论文的“系统功能设计”章节,方便画功能结构图。

3.4 支付功能对接

预约课程必然涉及付费,微信支付的对接逻辑是:前端调wx.requestPayment之前,需要后端先创建一个预支付订单,调用微信支付的统一下单API,拿到paySign等参数返回给前端。这里面最需要注意的有三件事:

  • 金额的单位是分。我吃过亏,直接把course.price(元)传给支付接口,结果支付金额少了一百倍。后端统一转成number类型,且用Math.round(price * 100)。
  • 签名算法用官方SDK。别自己手搓MD5拼字符串,用wx-pay或wechatpay-node-v3这种维护良好的库,用APIv3密钥。
  • 支付回调处理。用户支付成功,微信服务器会回调你的通知接口,你要在这个回调里更新订单状态、释放预约名额。注意:回调接口必须做签名验证,且成功处理后返回{"code":"SUCCESS"},否则微信会连续重试,容易造成重复发货。

3.5 消息通知

会员预约成功、开课提醒、课程取消,这些都需要实时通知。小程序里有两类通道:wx.requestSubscribeMessage订阅消息和公众号模板消息。我用的是订阅消息,因为不需要用户额外关注公众号,只需在小程序内授权订阅。有个细节是:订阅消息是一次性的,用户订阅一次只能发一条,所以每次用户预约时我都请求一次订阅,提醒文案写清楚,别滥用,否则用户直接拒绝。

4. 项目源码结构与部署实操

4.1 完整目录结构与说明

很多网上下载的“项目源码”解压后一堆乱文件,根本跑不起来。我这里给一个清爽的目录结构,前端后端分开,你照着组织就行:

fitness-weapp/ ├── miniprogram/ # 微信小程序前端 │ ├── pages/ │ │ ├── index/ # 首页(推荐课程) │ │ ├── schedule/ # 排课列表 │ │ ├── booking/ # 我的预约 │ │ ├── course/ # 课程详情 │ │ ├── profile/ # 个人中心 │ │ ├── checkin/ # 打卡签到 │ │ └── admin/ # 管理员入口 │ ├── utils/ │ │ ├── request.js # 封装wx.request │ │ └── auth.js # 登录态管理 │ ├── components/ │ ├── app.js │ ├── app.json │ └── app.wxss ├── server/ │ ├── controllers/ # 业务逻辑层 │ ├── models/ # 数据模型 │ ├── routes/ # 路由 │ ├── middleware/ # JWT验证、日志 │ ├── config/ # 配置(数据库、微信) │ └── app.js ├── database/ │ └── init.sql # 建表脚本 └── docs/ # 论文、说明文档

utils/request.js是关键文件,所有请求都走它,统一处理token、错误码、加载态。我的封装思想是:请求发出去前自动带上Authorization,返回码非0时自动弹出错误提示,避免每个页面重复写wx.showToast。

4.2 小程序端请求封装示例

// utils/request.js const BASE_URL = 'https://your-api-domain.com' function request(path, method = 'GET', data = {}) { return new Promise((resolve, reject) => { const token = wx.getStorageSync('token') wx.request({ url: `${BASE_URL}${path}`, method, data, header: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, success(res) { if (res.data.code === 0) { resolve(res.data.data) } else if (res.data.code === 401) { // token失效,重新登录 wx.removeStorageSync('token') wx.navigateTo({ url: '/pages/login/login' }) reject(new Error('登录已过期')) } else { wx.showToast({ title: res.data.message, icon: 'none' }) reject(new Error(res.data.message)) } }, fail(err) { wx.showToast({ title: '网络异常', icon: 'none' }) reject(err) } }) }) }

有了这个封装,页面里调用就很简单:

// pages/course/course.js const request = require('../../utils/request') Page({ onLoad() { this.loadCourses() }, async loadCourses() { const list = await request('/api/course/list', 'GET', { type: 'private' }) this.setData({ courses: list }) } })

4.3 后端Node.js核心代码

后端我用Express搭建,结构清晰易读。用户登录接口的关键实现如下:

// server/controllers/auth.js const axios = require('axios') const jwt = require('jsonwebtoken') const { getOpenId, findByOpenId, createUser } = require('../models/user') const APPID = 'your-appid' const SECRET = 'your-secret' exports.login = async (req, res) => { const { code } = req.body const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${APPID}&secret=${SECRET}&js_code=${code}&grant_type=authorization_code` const { data } = await axios.get(url) if (data.errcode) { return res.json({ code: 1, message: '微信登录失败' }) } let user = await findByOpenId(data.openid) if (!user) { user = await createUser({ openid: data.openid, nickname: '微信用户' }) } const token = jwt.sign({ userId: user.id }, 'your-secret-key', { expiresIn: '7d' }) res.json({ code: 0, data: { token, userInfo: user } }) }

这个接口敲定后,后面所有业务接口的req.userId都来自中间件解析。中间件代码不复杂,但你必须写好,否则每个接口都要重复验证。我还加了一层简单错误处理:所有接口try/catch包起来,返回code: 500,前端统一提示,日志记录到文件,排查问题方便。

4.4 数据库初始化脚本片段

MySQL的建表脚本我强调三个点:innodb引擎、utf8mb4字符集、关键字段索引。utf8mb4是为了支持emoji,微信昵称里各种特殊符号很多,不用utf8mb4会报错。索引这块,booking.schedule_id、booking.user_id、schedule.date这三个查询频次最高,必须加索引。

CREATE TABLE `booking` ( `id` INT NOT NULL AUTO_INCREMENT, `user_id` INT NOT NULL, `schedule_id` INT NOT NULL, `coach_id` INT DEFAULT NULL, `status` VARCHAR(10) DEFAULT '已预约', `book_time` DATETIME DEFAULT CURRENT_TIMESTAMP, `cancel_time` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_schedule_id` (`schedule_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

4.5 部署上线避坑清单

真机测试和部署阶段,我把能踩的坑基本都踩了个遍,列出来帮你省时间:

  • 小程序后台要把“合法域名”配好,开发模式下可以在开发者工具里勾掉域名校验,但真机预览必须用https且域名已备案,否则请求直接被拦截。
  • 后端服务器建议用Nginx做反向代理。client_max_body_size 10m必须配大,不然用户上传头像时413错误。
  • 数据库连接池要设好。我用的mysql2连接池connectionLimit: 10,高峰期并发预约时不会把数据库打挂。
  • 日志必须打两点:请求时间和耗时、微信返回的原始错误。线上问题排查全靠它。
  • HTTPS证书用免费版就行,比如Let's Encrypt。小程序强制要求HTTPS,别为省钱用自签名证书,测试的时候坑到你怀疑人生。

5. 常见问题与排查技巧实录

5.1 微信开发者工具和真机表现不一致

这是小程序开发最大的坑。开发者工具里的执行环境是模拟器,很多API(比如GPS、支付)在工具里会静默失败或无响应。我的经验是:核心流程必须第一时间真机调试。建议在开发者工具里勾选“真机调试”模式,用手机扫码直接跑,从登录到预约到支付全链路走一遍,工具里看不出问题的点,真机上全现形。

具体说两个高频问题:

  • 支付功能在工具里只能看到模拟弹窗,真机上才会调用真实的微信收银台。如果你在工具里测完支付就上线,大概率真机白屏或报requestPayment:fail。解决办法:真机支付前确认wx.requestPayment的timeStamp是字符串类型,官方文档要求这个字段是字符串,很多人传成数字导致签名不匹配。
  • 视频播放器在工具里正常,真机上iOS无声。这个我提过,video组件的muted属性如果没设,iOS在静音键开启时视频没声音。适合办法:不加muted属性,或监听binderror手动提示用户。

5.2 预约冲突与并发问题

场景:同一个时间段,两个会员同时抢同一节课的最后一个名额。如果不做并发控制,两个人都会看到“还有1个名额”,然后都预约成功,超卖。

我在booking create接口里用数据库事务加行锁解决:

const schedule = await db.query('SELECT * FROM schedule WHERE id = ? FOR UPDATE', [scheduleId]) if (schedule.booked_count >= schedule.capacity) { throw new Error('名额已满') } await db.query('UPDATE schedule SET booked_count = booked_count + 1 WHERE id = ?', [scheduleId]) await db.query('INSERT INTO booking SET user_id = ?, schedule_id = ?', [userId, scheduleId])

SELECT ... FOR UPDATE是关键,它锁住这一行,事务提交前别人无法修改,从根源避免超卖。注意,这条SQL必须在事务里执行,最后COMMIT,否则锁不释放。

5.3 缓存策略:为什么小程序页面会看到“脏数据”

课程列表和排课信息属于“读多写少”的数据,小程序端我会用wx.setStorageSync做本地缓存,设置5分钟有效期。具体做法:请求回来后就存缓存,并记录缓存时间,下次打开页面先读缓存,再静默请求最新数据刷新。这个策略要注意两个问题:

  • 缓存时间用时间戳记录,别用Date()字符串比较,iOS的Date格式兼容性问题会让你拿不到缓存。
  • 如果管理员在后台修改了课程价格或排课,用户在本地缓存5分钟内不会看到更新。可接受范围内。预约、支付等强一致性操作绝不走缓存,必须实时请求。

5.4 审核被拒怎么办

小程序发布预览提交审核时,最常见的驳回理由是“涉及用户隐私未声明”和“类目选择不正确”。健身类小程序建议选“生活服务 > 运动健身”,需要补营业执照;如果是个人主体,很多诱导性内容会受限,审核更严。

我踩过的一个坑是:课程详情页放了“扫码进群领优惠”的二维码,审核直接被以“涉嫌诱导分享”拒绝。解决办法:把这种引流动作放到线下,小程序内只保留核心业务。审核被拒不丢人,关键是阅读平台的运营规范,把敏感文案提前规避掉,能省一周时间。

5.5 数据库连接超时与内存泄漏

部署在低配云服务器上时,Node进程跑几天后响应变慢,重启后恢复——这多半是数据库连接泄漏。排查步骤:

  • 检查是否用连接池(见上文配置)。
  • 检查代码里有没有手动createConnection却没end()的情况。
  • 把process.on('unhandledRejection')的日志打出来,很多库的异步异常会被吞掉,不记日志根本不知道哪里挂了。

6. 论文说明的重点撰写建议

论文这块,大家问得最多的是“怎么写才能过”。我直接给你一个逻辑框架,按这个顺序写,导师挑不出大毛病。

6.1 论文结构完整版

第一章绪论,讲背景意义。这里别空喊“随着互联网发展”,要结合健身行业现状:传统健身房会员管理效率低、预约靠微信群接龙、数据无法沉淀。核心数据写一两句,比如“中国健身人群已超7000万”这种可查证的宏观数据即可。

第二章关键技术介绍。如果你是Java/PHP后端就写Spring Boot/ThinkPHP,我是Node.js,就写Express、MySQL、微信小程序框架。注意:这章别写太深,点到为止,重点讲这些技术为什么适合本项目。

第三章需求分析。主要写功能需求和非功能需求。功能需求用用例图(UML)表达,角色包括会员、教练、管理员。非功能需求写性能要求(预约响应时间<2秒,并发支持100+)、安全要求(HTTPS、JWT)、兼容性要求(iOS/Android)。

第四章系统设计。画架构图、模块图、ER图、时序图。这里的关键不是图多,而要体现你真正想清楚了业务流程。比如“预约流程时序图”,从会员点击约课到后端写库、返回结果,每一步的箭头和消息要准确。

第五章系统实现。对着功能模块写代码截图和关键代码解释。导师最不爱看整段代码贴上去,我的建议是:贴核心代码3~5行,然后用一小段文字解释业务逻辑,比如“此处通过事务保证预约与名额扣减的一致性”。

第六章测试。写测试用例表,覆盖正常流程和异常流程。比如“用户预约时课程已满,系统是否正确提示”“用户取消超时后,是否被禁止操作”。有条件的做一下压测,哪怕是用ab工具测一下登录接口的QPS,这个数据在论文里很出彩。

6.2 论文里的“亮点”怎么写

除了常规的增删改查,你要在论文里刻意强调两三个“有深度”的点,导师一眼就能看出你写的是真东西。我这边的建议:

  • 事务与并发控制:解释SELECT ... FOR UPDATE行锁机制及其在防止超卖中的作用。
  • 接口安全设计:描述JWT无状态鉴权和token刷新机制,说明为什么不用session。
  • 消息通知的订阅策略:讲清楚怎么把一次性订阅消息的额度用在刀刃上(只在关键节点请求)。

这三个点加上项目本身的业务复杂性(会员、教练、课程、预约、支付、打卡),论文的“创新点”就立住了。

7. 实操总结与个人心得

文章写到这里,核心内容基本都覆盖了。最后我来收个尾,说点掏心窝的话。

做这类项目,最大的收获不是代码能力,而是你用一套完整的技术栈解决了一个真实问题的全过程。从需求调研到数据库设计,从接口联调到真机调试,从部署上线到论文答辩,每一个环节都会遇到“卡住半天”的时刻。我印象最深的是第一次把支付流程跑通的那个晚上,在小程序里点了确认支付,微信收银台真的弹出来,银行卡扣款短信到了,那种成就感是刷一百道算法题都换不来的。

如果你准备照着这个思路动手,我有三条建议:第一,先把数据库建好再写代码,表结构不稳固,后面全是重构;第二,接口文档先用表格列清楚再让前后端并行开发,能少吵很多架;第三,预留两周的测试缓冲时间,不要以为功能写完了就能上线,真机兼容性和审核流程消耗的时间远比你想象得多。

这个项目的技术栈已经是目前做小程序管理系统最主流的组合,源码和论文结构都可以直接复用。如果你在部署时遇到我上面没写到的问题,或者论文某个章节不知道怎么展开,直接围绕你踩坑的具体细节去查资料、去社区提问,比套模板管用得多。做系统的过程本来就是解决问题的过程,希望你能在这个项目里体验到那种把一个想法做成一个可用产品的完整快感。

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

FalconDemo.rar 拆包实战:从环境隔离到首次运行与避坑指南

简介&#xff1a;FalconDemo.rar 是一套面向 KNX 智能家居与楼宇自动化开发者的数据获取与写入测试程序&#xff0c;适合具备一定 .NET 基础、需要验证 KNX 总线通信稳定性和兼容性的工程师使用。压缩包共 14 个文件&#xff0c;约 1.08MB&#xff0c;以 7 个 dll 动态链接库为…

作者头像 李华
网站建设 2026/9/26 13:31:00

OrangePi 5 Plus 双EtherCAT与六路CAN软实时部署实战

1. 为什么要在 OrangePi 5 Plus 上折腾 EtherCAT 和 CAN第一次拿到 OrangePi 5 Plus 的时候&#xff0c;我其实没打算把它做成工业现场控制器。手头这块板子用的是瑞芯微 RK3588&#xff0c;8 核 CPU、最多 32GB 内存、双 2.5G 网口、PCIe 3.0 四通道、还有一堆 M.2 和 USB 3.0…

作者头像 李华