ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于Qt与MySQL的垃圾分类查询系统实战指南

基于Qt与MySQL的垃圾分类查询系统实战指南 简介这是一份基于QT与MySQL的垃圾分类查询系统完整源码附带项目说明文档适合计算机相关专业学生用于课程大作业、毕业设计或作为Qt与数据库开发的入门练手项目。系统涵盖垃圾类别查询、添加、修改、删除等核心功能源码区分界面设计ui、逻辑实现cpp/h、样式配置qss与图标资源等模块结构清晰便于按模块研读和二次开发。压缩包共46个文件体积仅109KB轻量易部署包含13张界面截图、8个C源文件、7个头文件、6个UI界面、4套样式表及项目工程文件、数据库说明文档等覆盖从界面到功能实现的完整链路。目前已有94人学习/下载适合需要快速搭建垃圾分类查询演示项目或上手Qt桌面开发的读者。1. 先搞清这套垃圾分类查询系统到底在解决什么问题一到晚上小区垃圾分类督导群里问得最多的三句话是塑料瓶壳算什么垃圾吃剩的玉米棒是厨余还是其他碎陶瓷片能扔可回收桶吗很多时候人比垃圾桶更困惑。基于QTmysql搭建的垃圾分类查询系统就是把这套问答装进一个桌面程序库里有分类标准输入垃圾名就能查查完还能顺手把词条补进MySQL。这类源码包的典型价值在于它既是一份能直接运行的Qt数据库实训项目也是一份可以二次开发的垃圾分类数据维护工具适合做课设、接物联网屏或者给单位内部做一台离线查询机。看懂这份源码包并不难难的是让它在你的电脑上顺畅转起来。2. 系统拆解Qt 桌面端 MySQL 数据层先看模块再看表2.1 这套系统常见四个功能模块拿到“基于QTmysql搭建的垃圾分类查询系统”这样的源码包我一般先把界面跑起来再按功能一刀切成四块垃圾名称查询、分类浏览、数据维护、记录导出。前两块是给值班人员用的后两块是给管理员维护数据用的。如果你要做课设答辩这个划分恰好能对着需求分析讲评审老师一听就知道项目边界在哪。垃圾名称查询输入“塑料瓶壳”或“废电池”返回属于可回收、有害、厨余、其他中的哪一类同时给出投放说明。这是系统的核心用例对应标题里的“查询系统”。分类浏览按四类垃圾分别列出词条方便没有具体名字的时候按大类去找也方便检查数据库里各类别数据量是否均衡。数据维护增删改垃圾词条主要处理各地叫法不统一的问题比如“厨余垃圾”在有些小区叫“湿垃圾”“其他垃圾”叫“干垃圾”。记录导出把高频查询词条导出成表格给宣传岗做物料。这个不是标配但源码里加一个也不会伤筋动骨。模块在Qt里的落点通常很直白查询对应一个主窗口 MainWindow维护对应一组 QDialog 或表单页导出对应一个 QFileDialog。别小看这种结构它正好符合 Qt 的 Model/View 分工界面只管展示和输入数据全走 SQL界面层不直接操作链表或 STL 容器。很多新手爱把查询结果塞到一个成员变量 QList 里到处传一旦改了查询条件就要手动清空同步代码很快就变成一团乱麻。2.2 数据库设计一张主表几乎够用字段要按查询习惯来垃圾分类查询数据逻辑简单一张表就够id、垃圾名称、类别、投放说明、扩展关键词。真正要花心思的是“名称”这个字段垃圾的别名实在太多同一个“塑料瓶”可能有“塑料瓶壳”“饮料瓶”“矿泉水瓶”好几种写法。所以 name 存标准名keyword 存别名查询时两个字段一起 LIKE 匹配。建表语句我习惯写成这样源码包里的 sql/init.sql 一般也是这个思路CREATE DATABASE IF NOT EXISTS garbage_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE garbage_db; CREATE TABLE IF NOT EXISTS garbage_item ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT 主键, name VARCHAR(64) NOT NULL COMMENT 标准垃圾名称, category TINYINT NOT NULL COMMENT 1可回收 2有害 3厨余 4其他, detail TEXT COMMENT 投放说明和常见误区, keyword VARCHAR(64) NOT NULL DEFAULT COMMENT 别名/关键词空格分隔, UNIQUE KEY uk_name (name), KEY idx_keyword (keyword) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT垃圾分类词条表;这里有一个容易被忽略的点category 用的是 TINYINT 而不是 VARCHAR。排序、统计、下拉筛选都更友好等后面做“可回收垃圾一共多少条”这类统计 SQL 时TINYINT 能直接参与运算如果你用“可回收”三个字做字段值查询必然带上中文比较索引和排序都会走得很别扭。字段表字段类型说明idINT UNSIGNED主键自增nameVARCHAR(64)标准名称唯一索引categoryTINYINT1可回收2有害3厨余4其他detailTEXT投放说明keywordVARCHAR(64)别名查询时与 name 一起匹配keyword 字段的设计对这个系统很关键。比如“旧衣服”和“废旧织物”是两个词条还是同一个词条按标准分类它们同属可回收但市民输入时多半打“旧衣服”。我会把“旧衣服”作为 name 存keyword 里写“废旧织物 织物 衣服”查询时 name LIKE 和 keyword LIKE 一起命中市民怎么顺口怎么来系统都能兜住。2.3 Qt 界面选型Widgets 还是 QML用 Qt 做这种工具型桌面系统我基本不犹豫直接选 Widgets。原因不是 QML 不好而是这个场景里没有动画需求、没有触屏滑动需求数据表格和输入框的密集交互恰恰是 Widgets 的强项。QML 的优势在嵌入式触摸屏、视觉展示和动效界面如果你打算把这套系统后续怼到一块带触摸屏的树莓派垃圾房终端上那时候再考虑 QML 也不晚。对比项WidgetsQML表格/表单原生支持QTableView 成熟稳定要自己搭组件或引入第三方库中文输入法系统级兼容嵌入式环境容易出焦点问题打包体积较小需带 QML 运行时库适用场景桌面工具、管理后台触摸屏、动效展示选 Widgets 还有一个现实理由源码里如果有 mainwindow.ui 这种文件那你一定是在用 Qt Designer 编辑界面字段的 objectName 都能在设计器里直接看到排查问题比纯代码布局直观得多。代码布局不是不行只是改动一个按钮位置要重新编译用 .ui 文件改完保存就能继续调试效率差一大截。2.4 源码包目录到底长什么样拿到这种源码包我一般先不急着编译把包解开按四类文件归档一个 .pro Qt 工程文件、main.cpp 入口、MainWindow 相关的主窗口代码和 .ui 界面文件、一个 sql 目录放建表和数据脚本、最后是一份 README 或项目说明文档。如果你的包不是这个排布也没关系认准 .pro 文件和 sql 脚本两个锚点就能判断工程的编译入口和数据初始化入口。“项目说明”那份文档通常不是代码而是告诉你需求背景、功能列表、数据库 SQL、界面截图、打包方法。这是判断源码能不能跑起来的第一手资料先读它再读代码。别一上来就编译很多翻车都是因为环境版本和文档写的对不上比如文档写的是 MySQL 5.7你机器上装的是 MySQL 8.0连接报错就不奇怪了。3. 把源码跑起来Qt 与 MySQL 的环境搭配和建库脚本3.1 版本匹配是第一道坎Qt 5.15 还是一个稳妥起点很多人在“能不能跑起来”这一步就折了最常见的不是代码问题是 Qt 版本、编译器套件和 MySQL 版本三者互相打架。对这个垃圾分类查询项目我的建议是 Qt 5.15 系列配 MinGW 64 位加 MySQL 5.7或者 Qt 6.x 配 MySQL 8.0。前者资料多踩坑的人多、答案也多遇到问题一搜就有前人的处理记录后者更接近以后接新项目的组合。两个都能跑关键是别混搭Qt 5.15 的 MinGW 版和 MSVC 版轮换用或者把 MySQL 5.7 的客户端库丢进 MySQL 8.0 环境都是翻车高发区。Qt 安装时注意勾选对应编译器套件MinGW 64-bit 或 MSVC 2019这个系统用不到额外模块SQL 驱动是默认组件。装完在 Qt Creator 里打开 .pro 文件工具链选错立刻能看到编译报错里的“cannot find -l…”或者 Qt 库版本对不上。经常有人把 Qt 5.15 和 Qt 6 装在同一台机器上Qt Creator 自动探测版本时选错后面所有 QSqlQuery 代码都报“无法解析的外部符号”先检查 Projects 页面里 Qt 版本和编译器是不是你想要的那一套。3.2 用 MySQL Workbench 或命令行把库建起来源码包里一般带着 sql 脚本如果没有按上一章的表结构自己建也行。Windows 上我习惯用 MySQL Workbench 打开脚本直接执行看得到执行日志哪条语句报错一目了然Linux 服务器上就用命令行mysql -u root -p init.sql执行前先确认 MySQL 服务已经起来。Linux 下常见卡在 socket 连不上报 error 2002 (HY000) cant connect to local MySQL server through socket基本是 mysqld 进程没启动或者 socket 路径不对先查服务状态再查 /tmp 下的 socket 文件Windows 下常见的是 MySQL 服务根本没启动打开“服务”面板把 MySQL 服务设为自动启动并启动它。执行完检查一下结果USE garbage_db; SHOW TABLES; SELECT COUNT(*) AS cnt FROM garbage_item;如果 garbage_item 里有数据能查到几十甚至上百条词条说明初始化已完成。一个脚本跑完就完事的系统后面所有报错几乎都能收敛到“数据库没连上”这一个原因而“没连上”又有八成都集中在三个参数上端口、用户名、密码。3.3 在源码里找到数据库连接代码并改成你的密码不管源码里连接数据库的代码是写在 main.cpp 里还是封装在 dbhelper.cpp 里最后都会走到这几行#include QSqlDatabase #include QSqlError #include QDebug bool initDatabase() { QSqlDatabase db QSqlDatabase::addDatabase(QMYSQL); db.setHostName(127.0.0.1); db.setPort(3306); db.setDatabaseName(garbage_db); db.setUserName(root); db.setPassword(你的MySQL密码); db.setConnectOptions(MYSQL_OPT_RECONNECT1); if (!db.open()) { qCritical() 数据库连接失败: db.lastError().text(); return false; } return true; }这段代码逻辑不难但参数有几个值得说。setHostName 用 127.0.0.1 而不是 localhost是因为某些 MySQL 在 Windows 上把 localhost 解析到 socket 或命名管道TCP 回环地址最稳。setPort 必须和 MySQL 实际监听的端口一致默认 3306装过多个实例的机器可能被改成 3307、3308。setConnectOptions 里的 MYSQL_OPT_RECONNECT1 是让连接在空闲断线后能自动重连值班亭机器长时间挂着不操作回头一查结果发现连接已经掉线这个选项能省一次重启程序的操作。连接代码能正常编译但运行时报“driver not loaded”再去检查 Qt 的 sqldrivers 插件目录里有没有 qsqlmysql 插件。Windows 上插件通常叫 qsqlmysql.dll放在 Qt 安装目录的 plugins/sqldrivers 下这个文件不在预期位置addDatabase(QMYSQL) 必然报错。3.4 .pro 文件怎么才算配好了Qt 工程用 .pro 文件描述依赖这个系统的 .pro 大概是这个量级QT core gui sql greaterThan(QT_MAJOR_VERSION, 4): QT widgets TARGET GarbageQuery TEMPLATE app SOURCES main.cpp \ mainwindow.cpp \ dbhelper.cpp HEADERS mainwindow.h \ dbhelper.h FORMS mainwindow.ui关键点在“QT sql”这一行。没有它所有 #include 和 QSqlDatabase 的代码在编译阶段就报错而且报的是很迷惑的“未知类型名”不熟悉 Qt 的人会把问题猜成编译器版本。另一个要点是 TARGET这个名字会变成生成的 exe 名称也是后面打包时裸程序的名字提前定好免得打包时改来改去。MySQL 头文件路径在 Windows 预编译 Qt 里一般不需要手动加因为 Qt 的 QMYSQL 插件已经在发布包里编好了运行时只需要 libmysql.dll只有当你自己从源码重新编译 Qt 的 MySQL 驱动、或者用纯静态编译时才需要在 .pro 里通过 INCLUDEPATH 和 LIBS 指明 MySQL 安装目录。绝大多数官网下载的 Qt 离线包直接把 libmysql.dll 放到 exe 同目录就能用别一上来就想着重新编驱动先确认缺的是不是运行库。4. 查询功能的完整链路从输入框到分类结果高亮4.1 用 Qt Designer 先把查询界面摆出来这个系统的界面核心不复杂从上到下三块一个 QLineEdit 输入框、一个查询按钮、一个结果区。结果区有两种做法一种用 QTableWidget 直接展示列表另一种用 QTableView 配 QStandardItemModel后者更适合后面做数据量大的场景面试和课设答辩也更好讲。我的习惯是输入框和按钮一行放 QHBoxLayout结果表格占中间绝大部分下方再放一个 QTextEdit 做详情区。在 Qt Designer 里给控件起好对象名比如 lineEditSearch、btnQuery、tableViewResult、textEditDetail。对象名一定要改因为后面全部代码都要靠 objectName 找控件默认的 lineEdit、pushButton 在代码里会认错改错一个名字轻则按钮没反应重则编译都过不去。布局用垂直 QVBoxLayout 包三个区域窗口拉伸时表格跟着放大输入行保持固定高度这是桌面查询工具最常见的布局手感。4.2 最核心的查询 SQLLIKE 模糊匹配和参数绑定查询按钮的槽函数是整个系统的命脉写法上我坚持用 QSqlQuery 的 prepare 和 addBindValue而不是字符串拼接。直接拼 SQL 在本地项目里看着省事但垃圾分类词条里全是中文和引号一个转义没处理就出语法错更稳的是让 MySQL 驱动替你做转义。void MainWindow::on_btnQuery_clicked() { QString keyword ui-lineEditSearch-text().trimmed(); if (keyword.isEmpty()) { ui-textEditDetail-setPlainText(请输入垃圾名称比如: 塑料瓶、废电池、剩饭); return; } QString sql SELECT id, name, category, detail FROM garbage_item WHERE name LIKE ? OR keyword LIKE ? ORDER BY category, name; QSqlQuery query; query.prepare(sql); QString pattern % keyword %; query.addBindValue(pattern); query.addBindValue(pattern); if (!query.exec()) { qCritical() query.lastError().text(); ui-textEditDetail-setPlainText(查询失败请检查数据库连接); return; } model-removeRows(0, model-rowCount()); while (query.next()) { int id query.value(0).toInt(); QString name query.value(1).toString(); int category query.value(2).toInt(); QString detail query.value(3).toString(); appendRow(id, name, category, detail); } if (model-rowCount() 0) { ui-textEditDetail-setPlainText( QString(没有找到与\%1\相关的垃圾分类词条\n 试试更常见的说法比如\塑料瓶壳\换成\塑料瓶\).arg(keyword)); } }这里有个容易踩的坑LIKE 的模糊匹配符号 % 不能加到绑定值里。有人写成 WHERE name LIKE ?然后 addBindValue(keyword)结果只能命中完全一样输入“塑料”查不到“塑料瓶”。所以我在绑定前先把 pattern 拼成“%关键字%”这个细节决定查询好不好用。QSqlQuery 在查询过程中要不断调用 value() 取列值列的顺序完全由 SELECT 语句决定别去猜表的字段顺序。如果你回头改数据库字段SELECT 语句和取值下标会同时失效。取值之后立刻转成对应类型SQL 里的 INT 转成 int、VARCHAR 和 TEXT 转成 QString避免后面用错了类型再回头查。4.3 结果展示按四类垃圾着色四分类在视觉上的区分很重要值班人员扫一眼颜色就知道该往哪投。我给可回收用绿色、有害用红色、厨余用棕色、其他用灰色这是各地垃圾桶标志的通用配色用户不需要重新学。void MainWindow::appendRow(int id, const QString name, int category, const QString detail) { QListQStandardItem * rowItems; rowItems new QStandardItem(QString::number(id)) new QStandardItem(name) new QStandardItem(categoryName(category)) new QStandardItem(detail); QColor bgColor; switch (category) { case 1: bgColor QColor(#C8E6C9); break; // 可回收 case 2: bgColor QColor(#FFCDD2); break; // 有害 case 3: bgColor QColor(#D7CCC8); break; // 厨余 case 4: bgColor QColor(#CFD8DC); break; // 其他 default: bgColor QColor(#FFFFFF); } for (QStandardItem *item : rowItems) { item-setBackground(QBrush(bgColor)); item-setEditable(false); } model-appendRow(rowItems); }categoryName(category) 自己实现就是一层 switch 返回“可回收/有害/厨余/其他”放一个公共函数里别在四个地方各写一遍。颜色值也可以做成常量表放界面但写死在 switch 里最直观。注意把背景色刷到这一行的每个单元格而不是只刷类别那一列否则表格看起来是一块块花斑。item-setEditable(false) 是防用户误双击改掉数据垃圾查询表是只读展示编辑必须走维护界面这是正规小系统的界面边界。4.4 数据量上来后的两个查询优化点垃圾分类词条量级一般不大几百条到几千条LIKE %xxx% 走不了索引也是秒回。但如果你把 keyword 字段做成空格分隔的别名比如“塑料瓶 饮料瓶 矿泉水瓶”完全匹配和前缀匹配能用到 idx_keyword 索引可以把 SQL 改成先用精确匹配查一遍没有结果再用 LIKE 兜底。另一个实用做法是给 category 加统计查询比如主界面显示“可回收 xx 条、有害 xx 条”。一条简单的 GROUP BY 查询就能撑住这个功能SELECT category, COUNT(*) FROM garbage_item GROUP BY category;在 Qt 里用 QSqlQuery 查这个结果填到状态栏或者界面角落比每次都 SELECT * 让界面更轻。这也是你答辩时能拿出来讲的优化点同一个数据库连接多条 SQL 各司其职查询链路里的每一步都有明确的数据流向。5. 避坑与排查Qt MySQL 联调最容易翻车的 5 个问题按前面步骤走大多数人能把系统跑起来。剩下的问题基本都是环境问题代码没动过、看着一模一样放到另一台机器上就报错。我按出现频率从高到低写五个排查点每条都是实际遇到过的翻车场景。5.1 QSqlDatabase: QMYSQL driver not loaded现象程序一启动控制台输出 driver not loaded界面提示数据库连接失败。原因Qt 代码里的 addDatabase(QMYSQL) 需要 sqldrivers 插件目录里有 qsqlmysql.dll同时 Windows 下还得有一个与 MySQL 版本匹配的 libmysql.dll。很多人只注意前者忘了后者。解决先确认 Qt 安装目录下 plugins/sqldrivers/qsqlmysql.dll 存在。找到 MySQL 安装目录里的 libmysql.dll复制到 exe 同级目录或者放到系统 PATH 里。注意位数Qt 是 32 位就配 32 位的 libmysql.dll64 位配 64 位的混了照样不认。提示在程序里打印 QSqlDatabase::drivers()能看到当前可用的驱动列表没有 QMYSQL 就一定是插件或客户端库缺失不用再猜别的。5.2 编译报 fatal: cannot mix incompatible Qt library (version ex50601) with this librar...现象工程在别人电脑上编译正常自己机器上编译就报这个 fatal后面跟着一长串版本号。原因这句话直译是“不能把不兼容的 Qt 库版本如 5.6.1和这个库混在一起”通常是编译器套件错乱了。常见场景之前用 MinGW 32 位编出来的中间文件没清理换到 MSVC 或 MinGW 64 位后继续编译。解决清掉 build 目录里的中间文件Qt Creator 菜单里选“清除”后重新构建。检查工具链Projects 里选的本套件Qt 版本、编译器、qmake 路径必须一致别让 qmake 来自 Qt 5.6.1 而编译器来自其他版本。如果有多个 Qt 版本确认 .pro 文件中没有写死到旧 Qt 路径的 INCLUDEPATH。这种报错和代码逻辑无关把构建目录删干净重来大多数情况下就恢复。我见过最离谱的一次是工程里残留了一个旧版编译出来的 moc 文件清掉 build 之后一切正常。5.3 查询出来的中文全是问号或者乱码现象数据库里存的是“塑料瓶”界面上显示“?????”或“鏂欑摱”。原因两个层面。一是数据库、连接、界面三者的编码不一致最典型的是建库时用了 latin1或者连接没加 utf8mb4。二是 Windows 下源码里的中文常量本身和编译器编码不一致用 MSVC 时源码文件保存为 UTF-8 而编译器按 GBK 解释。解决建库时明确 DEFAULT CHARACTER SET utf8mb4前面那份 SQL 脚本已经写了。Qt 连接里在 setConnectOptions 中加上 MYSQL_SET_CHARSET_NAMEutf8mb4。完整写法是一个字符串里用分号拼多个选项db.setConnectOptions(MYSQL_OPT_RECONNECT1;MYSQL_SET_CHARSET_NAMEutf8mb4);MSVC 下建议把所有源文件用 Qt Creator 的“以 UTF-8 保存”重新保存一遍。这个问题的特点是“白天连队库正常换到别人机器就乱”所以排查顺序永远是先查服务和库的字符集再查 Windows 区域设置和编译器选项。5.4 MySQL 8.0 连不上报 Authentication plugin caching_sha2_password cannot be loaded现象MySQL 5.7 跑得好好的换到 MySQL 8.0 后还是同一份代码open() 返回 false错误信息里写着 caching_sha2_password。原因MySQL 8.0 默认认证插件是 caching_sha2_password而部分 Qt 版本内置的客户端库版本比较老只认识 mysql_native_password。解决不用急着升级 Qt可以把应用账号改成老认证插件。我更推荐单独建一个应用账号别拿 root 天天连CREATE USER garbagelocalhost IDENTIFIED WITH mysql_native_password BY garbage123; GRANT ALL PRIVILEGES ON garbage_db.* TO garbagelocalhost; FLUSH PRIVILEGES;代码里用户名和密码改成 garbage/garbage123权限刚好卡在 garbage_db 这一个库上。这样即使账号泄露也不会把整个 MySQL 实例暴露出去。5.5 打包换机后报 qt.qpa.plugin: could not find the Qt platform plugin linuxfb / windows现象开发机上双击 exe 正常复制到另一台电脑或嵌入式板上启动闪退命令行运行看到 qt.qpa.plugin 报错。原因Qt 程序运行时需要 platforms 平台插件。Windows 桌面要 platforms/qwindows.dllLinux framebuffer 环境要 platforms/libqlinuxfb.so。打包时只拷了 exe 和几个 dll忘了平台插件目录。解决Windows 上用 windeployqt在 Qt 命令行里执行windeployqt GarbageQuery.exe它会自动把 platforms、sqldrivers、Qt 运行时 dll 全拷到 exe 目录。嵌入式 Linux 上检查构建设置里是否启用了 linuxfb 插件确认插件在 Qt 的 plugins/platforms 目录下启动前设置环境变量 QT_QPA_PLATFORMlinuxfb:/dev/fb0。这个报错和源码无关属于部署环节。交叉编译 Qt 给树莓派这种 ARM 板子时特别容易漏掉 platforms 插件拷文件时整个 plugins 目录一起拷过去最省心。6. 三个让这套系统更实用的收尾技巧系统跑通只是起点落到真实使用场景才是这套源码值钱的地方。我最后说三个每次都会用到的技巧。第一个是批量导入数据。靠界面一条条录词条不现实按市里下发的垃圾分类名录整理成 CSV然后用事务批量灌进去。几千条数据一次插入事务能保证插到一半出错不会留下一堆残数据。QSqlDatabase::transaction() 和 commit() 包住循环出错就 rollback这个写法在 MySQL 里比逐条 autocommit 快一个量级。第二个是给高频查询结果做一份本地缓存。垃圾分类词条变动不频繁但值班亭机器往往网络不好可以在启动时把整个词条表 load 到 QHash 里程序内查询直接走内存只有管理员维护时才写库。这个改造能让“输完汉字按回车”的响应从几十毫秒降到一两毫秒体验提升非常明显。第三个是导出 CSV。查出的结果用 QFile 写成带 UTF-8 BOM 的 csvExcel 双击不乱码直接给物业打印张贴QFile file(query_result.csv); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(file); out.setCodec(UTF-8); out QString(\xEF\xBB\xBF); // UTF-8 BOM out 垃圾名称,类别,投放说明\n; for (int i 0; i model-rowCount(); i) { out model-item(i, 1)-text() , model-item(i, 2)-text() , model-item(i, 3)-text() \n; } file.close(); }这三个技巧正好对应三种使用方式给管理后台批量铺数据、给前端提响应速度、给宣传口出物料。我自己的习惯是先把缓存加上再交付因为现场值班员对“卡不卡”的感知远比对“界面好不好看”的感知强。写这种小系统最大的收获是知道了不是数据库越复杂越好也不是界面越花哨越好而是把查询链路里每一条消息都处理干净。希望这个搭建思路和避坑清单能帮到你少走几趟环境配置的弯路。本文还有配套的精品资源点击获取
返回列表