# Campus Life Service Platform **Repository Path**: wq3stone/campus-life-service-platform ## Basic Information - **Project Name**: Campus Life Service Platform - **Description**: 毕业设计——基于微信小程序的校园生活服务平台 - **Primary Language**: Unknown - **License**: Zlib - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-30 - **Last Updated**: 2025-06-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目介绍 本项目为我的本科毕业设计(2025届),基于原作者[江政帅](https://gitee.com/jiangzhengshuai)的**[小程序校园帮](https://gitee.com/jiangzhengshuai/small-program-campus-help)**项目进行二次开发。 该项目包含了([用户小程序](./miniprogram))和[管理员后台管理系统](./admin),两个前端共用同一个[后端接口](./server)。 ## 摘要 ​ 本系统主要使用了微信标记语言(WXML)、微信样式语言(WXSS)、JavaScript作为用户前端语言开发小程序,使用Vue进行管理员Web前端页面开发,使用Node.js作为后端语言与前端进行数据交互,使用MongoDB作为数据库进行数据存储。基于以上技术,本系统已实现快递代取、打印服务等8个跑腿功能模块,用户可以选择以上任意模块发起订单,在用户身份审核后可以进行接单赚取服务费,用户手机号经授权后可以发起拼车订单,由系统进行匹配相似路线的订单并通知用户。系统经测试,功能可用,使用比较方便。 ## 技术栈 用户小程序:微信小程序原生开发 管理员后台管理系统:Vue.js 后端接口:Node.js 数据库:MongoDB ## 主要功能 1.用户操作 (1)用户信息管理模块:登录、注册、修改用户的个人信息 (2)生活模块:校园跑腿、拼车匹配。 2.管理员操作 (1)管理员信息管理:登录、注册、找回密码。 (2)拼车模块管理:对于用户在小程序端已提交的拼车贴管理。 (3)跑腿模块管理:对于用户在小程序端已提交的跑腿贴管理。 (4)用户信息管理:查询(浏览)全部或所需用户信息 ![系统功能结构图](./README_files/系统功能结构图.png) 功能详情及页面截图见论文,功能演示见[视频](https://www.bilibili.com/video/BV1QmjBzQEoo) # 部署步骤 首先请确保系统上已安装Node、npm、MongoDB。如下为我的本地环境与服务器环境: ![](./README_files/系统环境.png) 如果没有小程序上线需求,可以仅本地部署,无需上传到服务器,但是本地部署会受到微信的限制无法使用授权手机号(可以直接修改数据库)、联系官方客服功能,主要功能不受限制。 温馨提示:若想上线或使用完整功能,需要一台具有公网ip的服务器运行后端程序、一个域名解析到后端程序所在的服务器进行微信小程序的可信域名配置,此外还需要营业执照进行小程序的注册与认证,步骤非常繁琐。 ## 后端 ### 修改数据库文件 打开`model`中的`db.js`文件,修改以下内容: ```js mongoose.connect('mongodb://username:password@localhost:27017/schoolRun?authSource=admin') ``` > username改为自己的数据库用户名,password改为自己的数据库密码,localhost为数据库地址(本地部署无需修改),schoolRun为数据库名,authSource默认即可 然后找到以下内容根据提示修改(openid可以先默认,等用户创建出来去userInfo表查看自己的openid) ```js //第一次运行时将下面注释打开,创建一个管理员用户,openid要改成自己的 admin.create({ openid : 'oa7me7Yqwmce6xFZHOtbzVfyhfH0', username : 'admin', password : '123456', role : '超级管理员', nickName : '王勤磊', time : '2024-12-31 23:59:59' }) ``` ### 修改邮箱授权码 打开`model`中的`utils.js`文件,修改邮箱授权码。(发邮件功能仅拼车匹配模块使用,可根据自身需求二创) ### 修改小程序的appID和AppSecret 打开`router`中的`userRouter.js`,修改以下内容为自己的 ```js const appID = `wxdff4801780968d5d` const AppSecret = `347d6f58b4e7648ecf4ede072152bb56` ``` 进入到[后端目录](./server),打开命令行窗口,运行 ```cmd npm install ``` > 此命令的含义为安装`package.json`中要求的包,类似于python的`pip install -r requirement.txt`或maven根据`pom.xml`文件安装依赖。 > > 该命令执行后会在当前目录生成一个`node_modules`文件夹,其中包含了各种项目运行所需的模块。 再运行 ```cmd node app.js ``` > 运行后端启动文件。 ## 后台前端 进入到[前端目录](./admin),打开命令行窗口,运行 ```cmd npm install ``` 再运行 ```cmd npm run serve ``` > 运行vue启动文件。 ## 小程序端 使用微信开发者工具打开[小程序端目录](./miniprogram),不使用云开发。 进入后检查`app.js`中的`globalData.server`是否和自己部署的接口地址端口相同。 然后点击编译->预览即可。 ## 提示 若计划上线或使用完整功能: 需要修改`app.js`中的`globalData.server`为后端接口地址,如`https://mini.wq3stone.cn`。 需要修改后端的`db.js`中的连接地址为自己的。 (这里我把MongoDB安装在了自己服务器上,创建一个具有以下权限的用户,然后`localhost`改为自己的服务器公网地址) ```shell ****以下是查看权限命令而不是创建命令**** ····自行寻找创建用户的方法···· test> use admin switched to db admin admin> db.auth("admin", "xxxxxx") { ok: 1 } admin> db.getUsers() { users: [ { _id: 'admin.admin', userId: UUID('d0cee021-6aac-4a33-a3ed-d921e552ae4e'), user: 'admin', db: 'admin', roles: [ { role: 'root', db: 'admin' } ], mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ] } ], ok: 1 } admin> ``` 需要修改`model`中`utils.js`文件的邮箱授权码。(发邮件功能仅拼车匹配模块使用,可根据自身需求二创)。 需要修改小程序的`appID`和`AppSecret`:打开`router`中的`userRouter.js`,修改以下内容为自己的 ```js const appID = `wxdff4801780968d5d` const AppSecret = `347d6f58b4e7648ecf4ede072152bb56` ``` 由于微信小程序源代码上传限制,我将大部分图片文件放在了我的图床,若不进行上线,可以使用本地图片(我放在了`./README_files/部分图床文件`文件夹中)。若有上线计划,为避免后续图床关闭,建议将文件保存到自己的图床。 ### 配置nginx 进行如下所示的配置,并使用certbot进行https证书申请。 ![image-20250530152753722](./README_files/image-20250530152753722.png) ### 配置可信域名 在微信公众平台配置为解析到运行后端程序的nginx服务器IP地址才能使用。 ![image-20250530141423304](./README_files/202505301414413.png) # 改进与创新 1. 由于原作者是2022年9月开发的项目,微信官方在 2022 年 10 月 25 日 24 时后[对用户头像昵称获取规则进行了调整](https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01),由原有的` wx.getUserInfo`接口获取用户昵称头像更改为**头像昵称填写能力**。本人根据此接口对于用户授权功能进行了处理。 2. 新增用户头像昵称填写能力,用户手机号码由手动填写更改为微信官方实时验证组件。 3. 新增性别只能设置一次功能。默认性别是暂不设置,当用户从暂不设置切换到男或女时进行提醒,当用户处于男或女时将选择框锁定。(2025-2-18 01:40) ![b1c696d8-121c-40a5-8fd0-3b602daf5fd8](./README_files/202505301424028.png) 4. 新增邮件发送功能,便于订单提醒。 5. 新增拼车匹配模块。 6. 删除“代扔垃圾”模块。 # 展望 1. 用户头像的存取:对于同一openid应仅保存一份头像文件以节省资源。 2. 原作者写的设置默认地址我测试时不失效,未进行处理。 3. 拼车匹配模块的出发时间应该回显点击选择器时的时间(目前显示的进入模块的时间) 4. 根据性别和人数要求进行拼车匹配,需要设计一个合理的算法。目前我只实现了最简单的不限性别的两人匹配。 5. 订单提交按钮双击会重复提交订单。 6. 订单数量较多时订单页会显示异常。 7. 发单者若删除订单会导致接单者的收益也被删除,应该对订单设置状态码而非直接删除记录。 # 致谢 ## 谢自己的努力 在本项目的开发过程中,首先要感谢的就是自己,从大一刚入学时便埋下了一颗种子,想要实现一个解决实际问题的项目。 和姐姐探讨了下选题意义,进一步明确了此目标。 ![当时是微电子专业,毕业设计选题大多为硬件设计,后来转专业到软件工程。](./README_files/202505301430012.png) 以下是当时发现的问题,后来发现市面上已有众多校园跑腿小程序,但拼车功能的小程序寥寥无几(和市面上的打车程序的拼车不同,那种拼车系统考虑了司机端接单,用户支付的总金额还是要高于一个人打车所使用的金额) ![image-20250530145407800](./README_files/202505301454925.png) 从2月9日下午两点到2月10日早上7点通宵做此项目,应该是人生中第一次通宵(过年也就撑到三四点),第二天有实训课,谎称火车晚点未到实则补觉。 ![其实是通了宵做此项目](./README_files/202505301426058.png) 然后往后的日子几乎天天熬夜做这个项目。 ![几乎天天熬夜在做这个项目](./README_files/202505301429569.jpg) 从完全零基础,摸索着学习微信小程序、Node.js、Vue、MongoDB、Nginx,虽然大多都是比着葫芦画瓢,但是确实有所收获。 ## 谢原作者 [小程序校园帮: 校园帮微信小程序](https://gitee.com/jiangzhengshuai/small-program-campus-help) 没有此项目的框架,我不可能从0开始完成此项目,正因此项目的代码规范性,我可以轻松的阅读源码进行二次开发。 ## 谢一路提供帮助的所有人 从选题到项目完成,一步步的操作,互联网提供了巨大的帮助,包括DeepSeek、通义千问以及众多博客,把项目部署到服务器姐姐为我解决了出现的部分问题,让我基本掌握了项目从撰写到上线的全过程。 # 插曲 **数据库被黑** 原来的表全被删除。 ![数据库被黑](./README_files/数据库被黑.png) **xshell连的服务器,为啥我把xshell关了我当前那个进程就不运行了?** >没用后台启动,启动时使用: `nohup 启动命令 &`,如果要打印日志则使用`nohup 启动命令 > output.log 2>&1 &` > >想关闭只能`kill -9 进程号`,日志文件覆盖是> 追加是>> **Linux创建了用户并指定了家目录,不另外授予权限它是不是只能在家目录里进行读写操作,在家目录外只能读不可写** > 默认是这样的 **使用nginx让`domain.com:80`代理到`domain.com:3000`,这个过程用户可感知吗** 反向代理感知不到。 终于体会到了反向代理,nginx太厉害了。比如一个api服务就要占用一个端口,但是api网站却都能够使用80端口去请求,这就肯定用到了反向代理。https上的网页请求http会被浏览器拦截,使用nginx配置好证书也能让资源被正常访问。 ![a661d75c7025dc7716a5a8e637161919](./README_files/a661d75c7025dc7716a5a8e637161919.png) 这个问题终于被解决了。 **还遇到了跨域CORS问题,通过Node.js中配置即可** ```js const app = express(); // 允许跨域请求 app.use(cors({ origin: 'https://nav.wq3stone.cn', // 允许的域名 methods: ['GET', 'POST', 'PUT', 'DELETE'], // 允许的 HTTP 方法 allowedHeaders: ['Content-Type', 'Authorization', 'X-Custom-Header'] // 允许的请求头 })); ```