简介:这是一套面向计算机专业本科生的校园二手交易平台微信小程序毕业设计实战资源,专为毕设开发、课程设计及项目实训打造,解决学生缺乏完整可运行电商类小程序案例的痛点。资源包含789个文件,涵盖287个JS逻辑层代码、29个WXML视图结构、30个WXSS样式文件、80个Java后端接口、1个SQL数据库脚本及配套说明文档等,完整呈现前后端协同开发流程;压缩包仅8.48MB,轻量易部署。已有263人学习下载,项目经严格调试,支持一键导入开发者工具运行,附带清晰项目说明与模块划分,覆盖用户认证、商品发布、分类浏览、在线沟通、订单管理等核心功能,适合作为高分毕设直接提交或二次开发学习范本。
1. 项目概述与核心价值
最近几年,我身边不少计算机相关专业的学弟学妹在准备毕业设计时,都倾向于选择“校园二手交易平台”这个方向,尤其是基于微信小程序的实现。这确实是个聪明的选择。它不像电商系统那么庞大复杂,又比一个简单的博客或管理系统更能体现你的综合能力——前端、后端、数据库、产品逻辑、用户体验,一个项目全都能练到。更重要的是,它解决的是一个真实存在的痛点:每年毕业季,大量教材、电器、生活用品被当作废品处理,而新生入学又需要重新购买,信息不对称造成了巨大的浪费。一个便捷、可信、基于熟人社交关系链的校内二手交易平台,天然具有需求土壤。
这个毕业设计项目的核心,就是利用微信小程序这个国民级应用入口,构建一个服务于特定校园社区的轻量级C2C交易系统。它不仅仅是完成一个“增删改查”的作业,更是对移动开发生态、前后端分离架构、数据库设计以及产品思维的一次完整实践。你将从零开始,设计商品发布、浏览、搜索、沟通、交易(或交易意向达成)的完整闭环,并深入思考如何利用小程序的能力(如扫码、定位、客服消息、订阅通知)来优化体验。最终产出的不仅仅是一份论文和答辩PPT,更是一个可以实际运行、甚至有机会在校园内小范围推广验证的作品,这对你求职时的项目经验积累至关重要。
2. 项目整体架构与技术选型解析
做一个校园二手交易平台,技术栈的选型直接决定了开发难度、学习成本和项目的可扩展性。下面这套组合是我经过多个类似项目验证后,认为最适合毕业设计场景的“黄金搭配”。
2.1 前端:微信小程序原生开发
为什么不用uniapp或taro等多端框架?对于毕业设计而言,微信小程序原生开发是最直接、最稳妥的选择。首先,它学习曲线相对平缓,官方文档详尽,社区资源丰富,遇到任何问题几乎都能找到解决方案。其次,毕业设计的评审老师通常更认可你对原生技术的掌握,这能体现你的基础能力。最后,小程序云开发虽然方便,但为了更透彻地理解前后端交互和数据库操作,我建议将前端与后端分离。
技术要点:
- 页面结构:使用 WXML + WXSS + JS + JSON 的标准结构。重点掌握
flex布局,这是小程序页面布局的基石。 - 组件化:将商品卡片、搜索栏、底部导航栏等复用性高的部分封装成自定义组件,提高代码可维护性。
- API调用:熟练掌握
wx.request进行网络请求,并学会使用Promise或async/await进行异步处理,避免“回调地狱”。 - 用户系统:利用
wx.login获取code,传给后端换取自定义登录态(如token)。用户头像昵称通过wx.getUserProfile获取(注意用户授权策略变化)。 - 核心页面规划:通常需要首页(商品瀑布流/列表)、发布页、商品详情页、个人中心页、消息页这五大主页面。
2.2 后端:Node.js + Koa2 框架
选择Node.js是因为它JavaScript语言统一了前后端,对于学生来说上下文切换成本低。Koa2相对于Express更轻量,基于async/await的中间件机制写起来非常优雅,适合快速构建API服务。
技术要点:
- 项目初始化:使用
koa-generator快速搭建项目骨架。 - 路由管理:使用
koa-router,按模块划分路由,如/api/goods、/api/user、/api/upload等。 - 中间件应用:重点编写用于身份验证(JWT)、错误处理、请求日志的中间件。例如,一个验证token的中间件能保护所有需要登录的接口。
- 文件上传:使用
koa-body配合formidable或直接使用koa-static处理用户上传的商品图片,并返回可访问的URL地址给前端。 - API设计原则:遵循RESTful风格,接口返回格式统一为
{ code: 200, data: {}, msg: 'success' }这样的结构。
2.3 数据库:MySQL + Redis
MySQL作为成熟的关系型数据库,是存储用户、商品、订单等核心结构化数据的不二之选。Redis作为内存数据库,在这里扮演两个关键角色:缓存和会话存储。
数据库设计核心表(简化版):
- 用户表 (user):
id,openid(小程序用户唯一标识),nickname,avatar,phone,create_time等。 - 商品表 (goods):
id,title,description,price,original_price,category_id,images(JSON格式存储图片URL数组),status(0待审核/1上架中/2已售出/3已下架),seller_id,view_count,create_time,location等。 - 商品分类表 (category):
id,name,icon。 - 消息/聊天表 (message):
id,goods_id,from_uid,to_uid,content,is_read,create_time。这里实现一个简化的“站内信”模型,复杂实时聊天可用WebSocket,但毕业设计用轮询或长连接也能交代过去。 - 收藏表 (favorite)和浏览历史表 (history)也是体现产品细节的好设计。
Redis的实战应用:
- 缓存热点数据:将首页商品列表、热门分类信息缓存到Redis,设置过期时间(如60秒),大幅减少数据库压力。
- 存储验证码:用户绑定手机号时,发送的短信验证码以
captcha:phone为key存入Redis,设置5分钟过期。 - 存储用户会话:将JWT Token或Session ID与用户信息的映射关系存在Redis,实现快速的登录态校验和集群部署时的会话共享。
2.4 部署与运维:Linux + Nginx + PM2
对于毕业设计,你至少需要一台云服务器(学生优惠价很低)来部署你的后端和数据库。
- Linux:选择CentOS 7.x或Ubuntu 20.04 LTS。
- Nginx:配置反向代理,将域名(或服务器IP)的80端口请求转发到你后端Node.js服务运行的端口(如3000)。同时,用它来托管前端小程序打包后的静态资源(如果需要的话),以及做负载均衡(毕业设计单机即可)。
- PM2:Node.js进程管理工具。用它来启动你的后端应用,并实现进程守护(应用崩溃自动重启)、日志管理、性能监控。这是让项目稳定运行的关键一步。
注意:技术选型没有绝对的对错,只有适合与否。这套选型兼顾了实用性、学习价值和答辩时的“技术亮点”。如果你对Java更熟,后端可以换成Spring Boot;如果追求极致开发速度,小程序云开发+云数据库也是合规的选择,但可能不利于你深入理解后端原理。
3. 核心功能模块设计与实现细节
一个平台能否用起来,关键看核心功能流程是否顺畅。下面我们深入拆解几个最关键模块的实现逻辑和代码细节。
3.1 用户登录与身份系统
小程序登录流程是第一个拦路虎。其核心是后端如何通过微信的接口,将前端传来的临时code换成用户的唯一标识openid,并建立自己的用户体系。
后端接口/api/auth/login实现逻辑:
- 接收小程序端
wx.login()获取的code。 - 拼接参数,请求微信接口
https://api.weixin.qq.com/sns/jscode2session?appid=xxx&secret=xxx&js_code=xxx&grant_type=authorization_code。 - 获取微信返回的
openid和session_key。session_key是敏感信息,绝不能传给前端! - 检查数据库
user表,如果此openid不存在,则创建一条新用户记录;如果存在,则更新最后登录时间。 - 生成自定义登录态:使用
jsonwebtoken库,以openid和user_id为payload,生成一个JWT Token。 - 将Token返回给前端。前端后续所有需要认证的请求,都在
header中携带Authorization: Bearer <token>。
// 后端Koa2中间件示例:JWT验证 const jwt = require('jsonwebtoken'); const authMiddleware = async (ctx, next) => { const token = ctx.header.authorization?.replace('Bearer ', ''); if (!token) { ctx.throw(401, '没有token,请重新登录'); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); ctx.state.user = decoded; // 将解码后的用户信息挂载到ctx.state上 await next(); } catch (err) { ctx.throw(401, 'token无效或已过期'); } }; // 在需要保护的路由中使用 router.get('/api/user/profile', authMiddleware, async (ctx) => { const userId = ctx.state.user.userId; // ... 查询用户信息 });3.2 商品发布与图片上传
商品发布是核心交易流程的起点。难点在于多图上传和富文本描述(虽然校园二手通常不需要太复杂)。
小程序端实现要点:
- 选择图片:使用
wx.chooseMediaAPI,限制数量(如最多9张)和大小。 - 上传图片:遍历选中的图片文件,调用
wx.uploadFileAPI,将文件上传到后端专门的文件上传接口。务必显示上传进度,提升用户体验。 - 表单提交:所有图片上传成功后,会得到一个URL数组。将URL数组连同商品标题、描述、价格、分类等表单数据,通过
wx.request提交到商品创建接口。
后端接口/api/upload和/api/goods实现逻辑:
- 上传接口:使用
koa-body中间件处理multipart/form-data格式数据。将接收到的图片文件从临时目录移动到指定的静态资源目录(如public/uploads),并生成一个唯一的文件名(使用UUID或时间戳+随机数),最后返回该文件的访问URL。 - 商品创建接口:接收前端传来的商品数据(包含图片URL数组)。验证用户身份、数据合法性(如价格不能为负)。将
images字段(URL数组)以JSON字符串形式存入MySQL的text类型字段中。商品初始状态设为1(上架中)。
实操心得:图片处理是个大学问。毕业设计阶段,可以直接存储原图。但在生产环境,一定要考虑:
- 图片压缩:使用
sharp或imagemin库在服务器端压缩图片,节省存储和流量。- CDN加速:将图片存储到对象存储(如腾讯云COS、阿里云OSS),并开启CDN,让全国用户都能快速加载。
- 图片安全:检查上传文件的后缀和MIME类型,防止上传恶意脚本。对图片内容进行鉴黄、鉴暴恐等审核(可使用云服务商的AI内容安全服务)。
3.3 商品浏览、搜索与筛选
首页和列表页是流量入口,其性能和数据组织方式直接影响用户体验。
1. 首页商品瀑布流(分页加载):后端提供分页查询接口,如GET /api/goods?page=1&size=10。前端使用小程序scroll-view组件或直接监听页面的onReachBottom事件实现上拉加载更多。
-- 后端对应的SQL查询示例(需按时间倒序,并过滤已下架商品) SELECT * FROM goods WHERE status = 1 ORDER BY create_time DESC LIMIT 0, 10;关键优化:使用COUNT(*)查询总条数用于前端显示总页数,但此操作在数据量大时较慢。对于无限滚动的瀑布流,可以不做总数查询,只判断当前返回的数据是否小于size,小于则说明没有更多数据了。
2. 搜索功能:
- 简单实现:使用MySQL的
LIKE语句进行模糊匹配,如WHERE title LIKE '%键盘%'。但这是性能杀手,不推荐用于大规模数据。 - 毕业设计推荐方案:使用MySQL的
FULLTEXT全文索引。在goods表的title和description字段上建立全文索引,然后使用MATCH ... AGAINST语法进行搜索,效率远高于LIKE。
ALTER TABLE goods ADD FULLTEXT INDEX ft_idx_title_desc (title, description) WITH PARSER ngram; -- 对于中文需要ngram解析器 SELECT * FROM goods WHERE MATCH(title, description) AGAINST('二手键盘' IN NATURAL LANGUAGE MODE) AND status = 1;3. 多条件筛选:前端将用户选择的分类、价格区间、位置等参数传到后端。后端动态构建SQL查询语句。
// 后端Node.js代码片段(使用Knex.js或Sequelize等ORM会更安全) let sql = 'SELECT * FROM goods WHERE status = 1'; let params = []; if (categoryId) { sql += ' AND category_id = ?'; params.push(categoryId); } if (minPrice) { sql += ' AND price >= ?'; params.push(minPrice); } // ... 其他条件 sql += ' ORDER BY create_time DESC LIMIT ?, ?'; params.push((page-1)*size, size); // 使用数据库驱动执行带参数的查询,防止SQL注入3.4 简易站内信与沟通
实现一个完整的即时通讯(IM)系统对于毕业设计来说太重了。一个“简易站内信”系统足以满足基本沟通需求,并体现你的设计能力。
数据表设计:message表的设计很关键。除了基础字段,goods_id用于关联商品,from_uid和to_uid标识发送方和接收方。is_read标记消息是否已读。
业务流程:
- 用户在商品详情页点击“联系卖家”,前端跳转到聊天页面,并携带
goods_id和seller_id。 - 进入聊天页时,加载该用户与卖家关于此商品的历史消息。
- 用户发送消息,前端调用
/api/message/send接口,后端将消息存入数据库,并标记为未读。 - 消息推送(难点):由于小程序不支持后端直接向用户推送,常用方案有:
- 轮询:聊天页面定时(如每3秒)调用
/api/message/list接口拉取新消息。简单但低效、耗电。 - WebSocket:建立长连接,实现真正的实时通讯。这是更优解,可以使用
socket.io库。虽然增加了复杂度,但作为毕业设计的技术亮点非常出彩。 - 小程序订阅消息:当用户不在聊天页面时,可以发送一次性的订阅消息提醒“您有一条新消息”,引导用户点击进入小程序查看。这需要用户事先授权。
- 轮询:聊天页面定时(如每3秒)调用
WebSocket简易实现思路:
- 后端使用
ws或socket.io库创建WebSocket服务。 - 用户登录小程序后,建立WebSocket连接,并将自己的
user_id与连接进行绑定(存储在内存或Redis中)。 - 当A给B发送消息时,后端除了存数据库,还检查B是否在线(连接是否存在)。如果在线,则通过B的WebSocket连接直接将消息推送给B的前端。
- 前端小程序使用
wx.connectSocketAPI连接WS服务,并监听onMessage事件接收实时消息。
4. 数据库设计与优化实战
数据库是项目的基石,设计好坏直接影响性能和后续扩展。让我们深入ER图和核心SQL。
4.1 核心表结构详解
以下是为毕业设计优化的表结构,增加了必要的索引和注释:
-- 用户表 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `openid` varchar(100) NOT NULL COMMENT '微信OpenID,唯一标识', `nickname` varchar(100) DEFAULT NULL COMMENT '微信昵称', `avatar_url` varchar(500) DEFAULT NULL COMMENT '微信头像URL', `phone` varchar(20) DEFAULT NULL COMMENT '手机号(需绑定)', `credit_score` int(11) DEFAULT 100 COMMENT '信用分,用于未来信誉体系', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_openid` (`openid`), -- 唯一索引,防止重复用户 KEY `idx_phone` (`phone`) -- 手机号索引,用于登录或查找 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; -- 商品表(核心) CREATE TABLE `goods` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(200) NOT NULL COMMENT '商品标题', `description` text COMMENT '商品详情', `price` decimal(10,2) NOT NULL COMMENT '现价', `original_price` decimal(10,2) DEFAULT NULL COMMENT '原价', `category_id` int(11) NOT NULL COMMENT '分类ID', `images` json DEFAULT NULL COMMENT '图片URL数组,JSON格式,如["url1","url2"]', `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:0-待审核 1-上架中 2-已售出 3-已下架', `seller_id` int(11) NOT NULL COMMENT '卖家用户ID', `view_count` int(11) DEFAULT '0' COMMENT '浏览量', `location` varchar(100) DEFAULT NULL COMMENT '交易地点,如“宿舍楼A区”', `is_recommended` tinyint(1) DEFAULT '0' COMMENT '是否推荐', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_seller_status` (`seller_id`,`status`), -- 联合索引,高效查询“我的在售商品” KEY `idx_category_status` (`category_id`,`status`,`create_time`), -- 联合索引,高效查询分类列表页 KEY `idx_status_time` (`status`,`create_time`), -- 联合索引,用于首页最新商品排序 FULLTEXT KEY `ft_idx_title_desc` (`title`,`description`) WITH PARSER ngram -- 全文索引,用于搜索 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';4.2 索引优化与SQL性能
上表定义中已经包含了关键的索引。这里解释一下为什么这么设计:
idx_seller_status (seller_id, status):当用户进入“我的发布”页面时,最常见的查询是WHERE seller_id = ? AND status IN (1,2,3)。这个联合索引能直接覆盖查询,避免回表。idx_category_status (category_id, status, create_time):分类页面的典型查询是WHERE category_id = ? AND status = 1 ORDER BY create_time DESC。这个索引能同时满足筛选和排序,效率极高。idx_status_time (status, create_time):首页查询最新商品WHERE status = 1 ORDER BY create_time DESC。这个索引是专门为此优化的。FULLTEXT全文索引:用于中文搜索,比LIKE快几个数量级。记住,对于InnoDB表,全文索引只有在使用MATCH ... AGAINST语法时才生效。
常见慢SQL与优化:
- 问题:
SELECT * FROM goods WHERE title LIKE '%电脑%' ORDER BY create_time DESC LIMIT 0, 20; - 分析:
LIKE '%xxx%会导致全表扫描,ORDER BY在大量数据时排序开销大。 - 优化:改用全文索引
SELECT * FROM goods WHERE MATCH(title,description) AGAINST('电脑') AND status=1 ORDER BY create_time DESC LIMIT 0, 20;。并在(status, create_time)上建立索引。
4.3 事务与数据一致性
在“商品售出”这个场景中,涉及多个步骤:1. 更新商品状态为“已售出”;2. 可能生成一条订单记录;3. 更新买卖双方的信用或交易计数。这些操作必须作为一个整体,要么全部成功,要么全部失败,这就需要数据库事务。
// 使用Koa + mysql2库的事务示例 const connection = await db.getConnection(); // 从连接池获取一个连接 await connection.beginTransaction(); // 开启事务 try { // 1. 更新商品状态 await connection.execute('UPDATE goods SET status = 2 WHERE id = ? AND seller_id = ?', [goodsId, sellerId]); // 2. 创建订单记录(假设有订单表) await connection.execute('INSERT INTO `order` (goods_id, buyer_id, ...) VALUES (?, ?, ...)', [goodsId, buyerId]); // 3. 更新卖家售出数量 await connection.execute('UPDATE user SET sold_count = sold_count + 1 WHERE id = ?', [sellerId]); await connection.commit(); // 所有操作成功,提交事务 ctx.body = { code: 200, msg: '交易成功' }; } catch (err) { await connection.rollback(); // 任何一步出错,回滚所有操作 ctx.throw(500, '交易失败,数据回滚'); } finally { connection.release(); // 释放连接回连接池 }5. 毕业设计论文撰写与答辩要点
项目做得好,论文和答辩是展示成果的关键。切忌代码堆砌,要体现你的思考和设计。
5.1 论文核心章节组织
- 绪论:讲清楚背景(校园二手交易现状、浪费问题)、意义(经济、环保、社交)、以及你的小程序相比现有解决方案(如闲鱼、微信群)的优势(更垂直、更安全、更便捷)。
- 相关技术介绍:不要罗列教科书定义。结合你的项目,讲你为什么选这些技术。例如:“微信小程序提供了丰富的原生API和接近原生的体验,其基于微信社交链的传播特性与本项目的校园熟人社区定位高度契合...”。
- 系统需求分析:画出用例图。分角色(买家、卖家、管理员)阐述功能性需求(发布、浏览、搜索、沟通等)和非功能性需求(性能:首页加载<2秒;安全性:防SQL注入、XSS;可扩展性等)。
- 系统设计:这是重头戏。
- 架构设计:画出清晰的前后端分离架构图,标明客户端、服务器、数据库之间的数据流。
- 功能模块设计:用文字和框图说明各个模块(用户、商品、消息、管理等)的职责。
- 数据库设计:给出完整的ER图,并附上核心表结构说明(就是前面我们设计的那几张表)。重点解释你的索引设计思路(为什么创建那些索引)。
- 接口设计:挑选几个核心的RESTful API,用表格形式说明其路径、方法、请求参数、响应格式和示例。这能极大体现你的工程规范性。
- 系统实现与测试:
- 实现:不要贴大段代码!选择2-3个有代表性的核心代码片段并配以详细说明。例如:JWT验证中间件如何工作、商品分页查询的SQL优化、WebSocket消息推送的实现逻辑。
- 测试:描述测试环境,并用表格展示测试用例和结果。例如:“测试商品搜索功能,输入关键词‘教材’,验证返回结果是否相关且包含关键词”。
- 总结与展望:总结你完成了什么,遇到了哪些挑战(如性能优化、实时通信),是如何解决的。展望部分可以务实一点,比如“未来可引入信誉评价系统”、“增加在线支付担保交易功能”、“适配多校区场景”等。
5.2 答辩准备与演示技巧
- 演示文稿:PPT要简洁,多图少字。重点放架构图、ER图、界面截图、核心代码截图和测试结果。
- 现场演示:这是最加分项。确保在答辩前,将项目完整地部署到云服务器,并准备好两个微信账号(模拟买家和卖家)在小程序端进行全流程演示:注册/登录 -> 发布商品 -> 搜索商品 -> 发起聊天 -> 模拟成交。流程要流畅,网络要稳定。
- 预判问题:
- 技术类:“为什么用Node.js不用Java?”、“你的搜索功能是怎么实现的?如何优化?”、“如何防止恶意用户刷帖?”、“数据一致性如何保证?”
- 业务类:“和闲鱼比,你的优势在哪?”、“如何解决交易中的信任问题?”、“如果用户发布违规信息怎么办?”
- 扩展类:“如果用户量大了,你的系统哪里会成为瓶颈?如何优化?”(可以从数据库索引、缓存、负载均衡等方面回答)。
- 表达清晰:用“我们”而不是“我”,显得更专业。语速适中,重点突出。遇到不会的问题,可以坦诚地说“这方面我考虑得还不周全,后续可以朝……方向优化”,切忌不懂装懂。
6. 开发部署全流程与避坑指南
从零到一上线一个项目,你会遇到无数坑。我把最常见的坑和解决方案整理如下,希望能帮你节省大量时间。
6.1 本地开发环境搭建
- 小程序端:安装微信开发者工具。创建小程序项目时,AppID可以先使用测试号。在“详情-本地设置”中,勾选“不校验合法域名...”,方便本地调试。
- 后端端:安装Node.js(建议LTS版本)和MySQL。使用
git bash或cmder等更好的命令行工具。 - 数据库连接:后端连接MySQL时,新手常犯的错误是
ER_NOT_SUPPORTED_AUTH_MODE。这是因为MySQL 8.0使用了新的默认身份验证插件caching_sha2_password,而旧的Node驱动可能不支持。解决方案:用命令行登录MySQL后,执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES; - 跨域问题:开发时,小程序请求本地后端接口(如
localhost:3000)会因端口不同而跨域。解决方案:在小程序开发者工具的“详情-项目配置”中勾选“不校验合法域名”,同时在后端Koa中配置CORS中间件。// 安装 koa2-cors const cors = require('koa2-cors'); app.use(cors({ origin: function(ctx) { // 动态允许本地开发地址 return ctx.header.origin; }, credentials: true }));
6.2 服务器部署上线
- 购买与连接服务器:选择腾讯云/阿里云的学生机。使用SSH工具(如Xshell, FinalShell)连接。
- 环境安装:
yum install -y git nginx(CentOS) 或apt install -y git nginx(Ubuntu)。- 安装Node.js:建议使用
nvm管理多版本。 - 安装MySQL:从官网下载最新版或使用系统包管理器安装,记得运行
mysql_secure_installation进行安全初始化。
- 拉取代码与安装依赖:
cd /var/www git clone your-repo-url your-project cd your-project/backend npm install --production # 只安装生产依赖 - 配置Nginx:
测试配置并重启:# /etc/nginx/conf.d/your-domain.conf server { listen 80; server_name your-domain.com; # 或你的服务器IP location / { proxy_pass http://127.0.0.1:3000; # 转发到Node.js应用 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 静态资源托管(如果你有的话) location /uploads/ { alias /var/www/your-project/backend/public/uploads/; } }nginx -t && systemctl reload nginx。 - 使用PM2启动应用:
npm install -g pm2 cd /var/www/your-project/backend pm2 start app.js --name campus-second-hand pm2 save pm2 startup # 设置开机自启 - 配置小程序后台:在小程序管理后台的“开发-开发设置-服务器域名”中,将
request合法域名、uploadFile合法域名等设置为你的域名(http://your-domain.com)。必须是HTTPS!你需要申请SSL证书(云服务商提供免费证书),并在Nginx中配置443端口监听和证书路径。
6.3 常见问题排查清单
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 小程序无法请求后端接口 | 1. 域名未配置或配置错误 2. 服务器防火墙未开放端口 3. Nginx配置错误或未重启 | 1. 检查小程序后台域名配置,确保是备案的HTTPS域名。 2. 在服务器执行 curl http://localhost:3000/api/test看后端服务是否正常。3. 检查Nginx错误日志 tail -f /var/log/nginx/error.log。 |
| 图片上传失败或无法显示 | 1. 上传目录权限不足 2. Nginx静态资源配置错误 | 1. 检查上传目录权限:chmod -R 755 /path/to/uploads。2. 检查Nginx配置中 location /uploads/的alias路径是否正确。 |
| 数据库连接失败 | 1. 数据库服务未启动 2. 连接配置(主机、端口、用户、密码)错误 3. 远程连接权限未开启 | 1.systemctl status mysqld检查状态。2. 确认后端配置的数据库连接信息。 3. 登录MySQL,执行 GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;(生产环境请限制IP)。 |
| PM2应用频繁重启 | 1. 应用代码有未捕获的异常 2. 服务器内存不足 | 1. 查看PM2日志:pm2 logs campus-second-hand。2. 检查服务器内存使用: free -h,考虑优化代码或升级配置。 |
| 搜索功能非常慢 | 未使用索引或使用了错误查询 | 使用EXPLAIN分析SQL语句,如EXPLAIN SELECT * FROM goods WHERE title LIKE '%xx%';,确认是否使用了FULLTEXT索引。 |
最后一点个人体会:做这个项目的过程中,最大的收获可能不是学会了某个特定的框架或语言,而是建立起一个完整的“发现问题 -> 设计方案 -> 编码实现 -> 测试部署 -> 监控优化”的工程化思维。从纠结一个按钮的样式,到设计数据库索引优化查询性能,这种视角的转变是成为一名合格开发者的开始。遇到报错别慌,学会看日志(小程序开发者工具控制台、后端终端输出、Nginx错误日志、PM2日志),搜索引擎是你最好的老师。祝你毕业设计顺利,拿到优评!
本文还有配套的精品资源,点击获取