# 失物招领小程序
**Repository Path**: cayley_yu/lost-and-found-mini-program
## Basic Information
- **Project Name**: 失物招领小程序
- **Description**: 失物招领小程序,包含发布、管理失物招领信息的基础功能
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2025-11-20
- **Last Updated**: 2025-11-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 校园失物招领小程序
**中山大学失物招领微信小程序系统**
一个基于 UniApp + Vue3 + Gin + MySQL 的全栈失物招领平台
[](LICENSE)
[](https://gitee.com/cayley_yu/lost-and-found-mini-program)
[](https://gitee.com/cayley_yu/lost-and-found-mini-program/stargazers)
[功能特点](#功能特点) • [技术架构](#技术架构) • [快速开始](#快速开始) • [项目结构](#项目结构) • [API文档](#api-文档)
---
## 项目简介
本项目是一个面向中山大学在校师生的失物招领微信小程序,旨在帮助用户快速发布和查找丢失物品信息,提供便捷的校园失物招领服务。
### 核心价值
- 📱 **便捷发布**:一键发布失物或招领信息,支持图片上传和地点选择
- 🔍 **智能搜索**:基于 Python 的模糊搜索算法,支持中文拼音和错别字容错
- 👤 **个人中心**:管理个人发布记录,追踪物品状态
- 🎯 **精准匹配**:多维度搜索,快速找到相关信息
---
## 功能特点
### 📋 信息管理
- ✅ 发布失物/招领信息
- ✅ 编辑和删除个人发布
- ✅ 标记信息状态(进行中/已完成/已取消)
- ✅ 查看发布历史记录
### 🔎 搜索功能
- ✅ 多字段模糊搜索(标题、描述、地点、分类)
- ✅ 中文拼音搜索支持
- ✅ 智能相似度匹配算法
- ✅ 可调节相似度阈值(默认60%)
- ✅ 搜索结果按相似度排序
### 👥 用户系统
- ✅ 微信小程序登录授权
- ✅ JWT Token 认证机制
- ✅ 个人信息管理
- ✅ 用户状态控制
### 📊 其他特性
- ✅ 分页加载优化
- ✅ 下拉刷新/上拉加载
- ✅ 浏览次数统计
- ✅ 图片上传和展示
- ✅ 地图地点选择
- ✅ 响应式界面设计
---
## 技术架构
### 前端技术栈
| 技术 | 版本 | 说明 |
|------|------|------|
| [uni-app](https://uniapp.dcloud.io/) | 3.0+ | 跨平台应用开发框架 |
| [Vue.js](https://vuejs.org/) | 3.3.4 | 渐进式 JavaScript 框架 |
| [Pinia](https://pinia.vuejs.org/) | 2.1.6 | Vue 状态管理库 |
| [uni-ui](https://uniapp.dcloud.io/component/uniui/uni-ui.html) | 1.5.11 | uni-app 官方 UI 组件库 |
| Sass | 1.66.1 | CSS 预处理器 |
| TypeScript | 5.1.6 | JavaScript 超集 |
### 后端技术栈
| 技术 | 版本 | 说明 |
|------|------|------|
| [Go](https://golang.org/) | 1.19+ | 高性能编程语言 |
| [Gin](https://gin-gonic.com/) | 1.9.1 | 轻量级 Web 框架 |
| [GORM](https://gorm.io/) | 1.25.2 | Go ORM 库 |
| [JWT](https://jwt.io/) | 5.0.0 | JSON Web Token 认证 |
| [Viper](https://github.com/spf13/viper) | 1.16.0 | 配置管理库 |
| MySQL | 8.0+ | 关系型数据库 |
### 算法模块
| 技术 | 说明 |
|------|------|
| Python | 3.7+ |
| [rapidfuzz](https://github.com/maxbachmann/RapidFuzz) | 高性能模糊匹配库(C++实现) |
| [pypinyin](https://github.com/mozillazg/python-pinyin) | 中文拼音转换库 |
### 系统架构图
```
┌─────────────────────────────────────────────────────────────┐
│ 微信小程序前端 │
│ (UniApp + Vue3 + Pinia) │
└──────────────────────────┬──────────────────────────────────┘
│ HTTPS/REST API
│
┌──────────────────────────▼──────────────────────────────────┐
│ Gin 后端服务器 │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 路由层 │ │ 中间件 │ │ 业务逻辑 │ │
│ │ (Router) │ │ (Middleware)│ │ (Services) │ │
│ └─────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ └─────────────────┼──────────────────┘ │
│ │ │
│ ┌─────────────────▼──────────────────┐ │
│ │ 数据模型层 (GORM) │ │
│ └─────────────────┬──────────────────┘ │
└───────────────────────────┼──────────────────────────────────┘
│
┌─────────────────┼─────────────────┐
│ │ │
┌─────────▼────────┐ ┌──────▼──────┐ ┌───────▼────────┐
│ MySQL 数据库 │ │ 文件存储 │ │ Python 算法 │
│ │ │ (uploads) │ │ (模糊搜索) │
└──────────────────┘ └─────────────┘ └────────────────┘
```
---
## 项目结构
```
失物招领小程序/
├── front-end/ # 前端项目目录
│ ├── src/
│ │ ├── pages/ # 页面文件
│ │ │ ├── index/ # 首页(信息列表)
│ │ │ │ └── index.vue
│ │ │ ├── publish/ # 发布页面
│ │ │ │ └── publish.vue
│ │ │ ├── detail/ # 详情页面
│ │ │ │ └── detail.vue
│ │ │ ├── edit/ # 编辑页面
│ │ │ │ └── edit.vue
│ │ │ └── profile/ # 个人中心
│ │ │ ├── profile.vue # 个人中心首页
│ │ │ ├── my-publish.vue # 我的发布
│ │ │ ├── settings.vue # 个人设置
│ │ │ └── about.vue # 关于我们
│ │ ├── components/ # 组件
│ │ │ └── SearchBar.vue # 搜索栏组件
│ │ ├── api/ # API 接口封装
│ │ │ ├── auth.js # 认证接口
│ │ │ └── items.js # 物品接口
│ │ ├── utils/ # 工具函数
│ │ │ └── request.js # 请求封装
│ │ ├── store/ # Pinia 状态管理
│ │ ├── static/ # 静态资源
│ │ ├── App.vue # 应用入口
│ │ ├── main.js # 主入口文件
│ │ ├── pages.json # 页面配置
│ │ └── manifest.json # 应用配置
│ ├── package.json # 依赖配置
│ └── vite.config.js # Vite 配置
│
├── back-end/ # 后端项目目录
│ ├── config/ # 配置管理
│ │ └── config.go # 配置加载(Viper)
│ ├── middleware/ # 中间件
│ │ ├── jwt.go # JWT 认证中间件
│ │ └── logger.go # 日志中间件
│ ├── models/ # 数据模型
│ │ ├── database.go # 数据库连接
│ │ └── user.go # 用户模型
│ ├── routes/ # 路由
│ │ ├── router.go # 路由注册
│ │ ├── auth/ # 认证路由
│ │ │ └── auth.go
│ │ ├── api/ # API 路由
│ │ │ ├── user.go # 用户相关
│ │ │ ├── items.go # 物品相关
│ │ │ └── fuzzy_search.go # 模糊搜索
│ │ └── upload/ # 上传路由
│ │ └── upload.go
│ ├── uploads/ # 文件上传目录
│ ├── logs/ # 日志目录
│ ├── docs/ # 文档
│ │ └── database.sql # 数据库表结构
│ ├── main.go # 主入口文件
│ ├── go.mod # Go 依赖管理
│ └── go.sum # 依赖校验文件
│
├── algorithm/ # 算法模块
│ ├── fuzzy_search.py # 模糊搜索算法
│ ├── requirements.txt # Python 依赖
│ ├── test_api.py # API 测试脚本
│ ├── test_input.json # 测试输入数据
│ └── README.md # 算法文档
│
├── README.md # 项目说明文档
└── FUZZY_SEARCH_IMPLEMENTATION.md # 模糊搜索实现文档
```
---
## 快速开始
### 环境要求
- **Node.js**: 14.0+
- **Go**: 1.19+
- **Python**: 3.7+
- **MySQL**: 8.0+
- **微信开发者工具**: 最新版
### 1. 克隆项目
```bash
git clone https://gitee.com/cayley_yu/lost-and-found-mini-program.git
cd lost-and-found-mini-program
```
### 2. 数据库初始化
```bash
# 登录 MySQL
mysql -u root -p
# 执行数据库脚本
source back-end/docs/database.sql
```
数据库表结构包括:
- `users` - 用户表
- `lost_found_items` - 失物招领信息表
### 3. 后端启动
```bash
cd back-end
# 安装 Go 依赖
go mod download
# 创建配置文件(可选)
cp config.example.yaml config.yaml
# 编辑 config.yaml 配置数据库连接等信息
# 启动服务
go run main.go
```
后端服务将运行在 `http://localhost:8080`
**默认配置**:
- 端口: 8080
- 数据库: lost_found
- JWT密钥: your-secret-key-change-in-production(生产环境请修改)
### 4. Python 算法模块安装
```bash
cd algorithm
# 安装依赖
pip install -r requirements.txt
```
### 5. 前端启动
```bash
cd front-end
# 安装依赖
npm install
# 开发环境运行(微信小程序)
npm run dev:mp-weixin
# 构建生产版本
npm run build:mp-weixin
```
### 6. 微信开发者工具配置
1. 打开微信开发者工具
2. 导入项目:选择 `front-end/dist/dev/mp-weixin` 目录
3. 配置 AppID(在 `manifest.json` 中修改)
4. 配置合法域名(在微信公众平台后台配置)
5. 启动项目调试
### 7. 配置说明
#### 前端配置
修改 `front-end/src/utils/request.js` 中的 API 基础路径:
```javascript
const BASE_URL = 'http://localhost:8080'; // 开发环境
// const BASE_URL = 'https://your-domain.com'; // 生产环境
```
#### 后端配置
创建 `back-end/config.yaml`(可选,默认使用代码中的默认值):
```yaml
app:
name: LostFoundBackend
env: development
debug: true
server:
port: 8080
host: 0.0.0.0
database:
host: localhost
port: 3306
name: lost_found
username: root
password: your_password
charset: utf8mb4
parse_time: true
loc: Local
jwt:
secret: your-secret-key-change-in-production
expire_hours: 24
upload:
path: ./uploads
max_size: 10MB
allowed_types:
- jpg
- jpeg
- png
- gif
log:
level: info
file: logs/app.log
```
---
## API 文档
### 基础信息
- **Base URL**: `http://localhost:8080`
- **认证方式**: JWT Bearer Token
- **内容类型**: `application/json`
### 认证接口
#### 1. 微信登录
```http
POST /auth/login
Content-Type: application/json
{
"code": "微信登录code"
}
```
**响应示例**:
```json
{
"status": "success",
"data": {
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": 1,
"nickname": "张三",
"avatar_url": "https://..."
}
}
}
```
#### 2. 刷新 Token
```http
POST /auth/refresh
Authorization: Bearer {token}
```
#### 3. 登出
```http
POST /auth/logout
Authorization: Bearer {token}
```
### 物品信息接口
#### 1. 获取物品列表(公开)
```http
GET /api/public/items?type=1&status=1&page=1&size=10
```
**查询参数**:
- `type`: 类型(1=失物,2=招领)
- `status`: 状态(1=进行中,2=已完成,0=已取消)
- `page`: 页码(默认1)
- `size`: 每页数量(默认10)
- `category`: 分类
**响应示例**:
```json
{
"status": "success",
"data": {
"items": [
{
"id": 1,
"title": "黑色钱包丢失",
"description": "今天下午2点左右在图书馆三楼...",
"type": 1,
"category": "证件",
"location": "中山大学图书馆三楼",
"contact_info": "13800138000",
"images": ["https://..."],
"status": 1,
"view_count": 10,
"created_at": "2025-11-20T10:00:00Z",
"user": {
"id": 1,
"nickname": "张三"
}
}
],
"pagination": {
"page": 1,
"size": 10,
"total": 100,
"pages": 10
}
}
}
```
#### 2. 模糊搜索(公开)
```http
GET /api/public/items/search?keyword=钱包&threshold=60&page=1&size=10
```
**查询参数**:
- `keyword`: 搜索关键词(必填)
- `threshold`: 相似度阈值 0-100(默认60)
- `page`: 页码
- `size`: 每页数量
**响应示例**:
```json
{
"status": "success",
"data": {
"items": [
{
"id": 1,
"title": "黑色钱包丢失",
"similarity_score": 95.0,
"match_field": "title",
...
}
],
"keyword": "钱包",
"threshold": 60,
"search_type": "fuzzy",
"pagination": {
"page": 1,
"size": 10,
"total": 5,
"pages": 1
}
}
}
```
#### 3. 获取物品详情
```http
GET /api/public/items/:id
```
#### 4. 发布物品信息(需认证)
```http
POST /api/items
Authorization: Bearer {token}
Content-Type: application/json
{
"type": 1,
"title": "黑色钱包丢失",
"description": "详细描述...",
"category": "证件",
"location": "图书馆三楼",
"lost_time": "2025-11-20T14:00:00Z",
"contact_info": "13800138000",
"images": ["https://..."]
}
```
#### 5. 更新物品信息(需认证)
```http
PUT /api/items/:id
Authorization: Bearer {token}
Content-Type: application/json
```
#### 6. 删除物品信息(需认证)
```http
DELETE /api/items/:id
Authorization: Bearer {token}
```
#### 7. 标记完成(需认证)
```http
POST /api/items/:id/complete
Authorization: Bearer {token}
```
### 用户接口
#### 1. 获取用户信息
```http
GET /api/user/profile
Authorization: Bearer {token}
```
#### 2. 更新用户信息
```http
PUT /api/user/profile
Authorization: Bearer {token}
Content-Type: application/json
{
"nickname": "新昵称",
"phone": "13800138000",
"real_name": "张三"
}
```
#### 3. 获取我的发布
```http
GET /api/user/items?page=1&size=10
Authorization: Bearer {token}
```
#### 4. 获取用户统计
```http
GET /api/user/stats
Authorization: Bearer {token}
```
### 文件上传接口
```http
POST /upload/image
Authorization: Bearer {token}
Content-Type: multipart/form-data
file:
```
**响应示例**:
```json
{
"status": "success",
"data": {
"url": "http://localhost:8080/uploads/xxx.jpg"
}
}
```
---
## 数据库设计
### 用户表 (users)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT | 主键,自增 |
| openid | VARCHAR(128) | 微信openid,唯一索引 |
| nickname | VARCHAR(50) | 昵称 |
| avatar_url | VARCHAR(255) | 头像URL |
| phone | VARCHAR(20) | 手机号 |
| real_name | VARCHAR(50) | 真实姓名 |
| student_id | VARCHAR(20) | 学号/工号(预留) |
| campus | VARCHAR(50) | 校区(预留) |
| status | TINYINT | 状态(1=正常,0=禁用) |
| created_at | TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 更新时间 |
### 失物招领信息表 (lost_found_items)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT | 主键,自增 |
| user_id | BIGINT | 用户ID,外键 |
| type | TINYINT | 类型(1=失物,2=招领) |
| title | VARCHAR(100) | 标题 |
| description | TEXT | 详细描述 |
| category | VARCHAR(50) | 分类 |
| location | VARCHAR(100) | 地点 |
| lost_time | TIMESTAMP | 丢失/拾获时间 |
| contact_info | VARCHAR(100) | 联系方式 |
| images | JSON | 图片URL数组 |
| status | TINYINT | 状态(1=进行中,2=已完成,0=已取消) |
| view_count | INT | 浏览次数 |
| created_at | TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 更新时间 |
**索引设计**:
- `idx_user_id`: 用户ID索引
- `idx_type_status`: 类型和状态联合索引
- `idx_location`: 地点索引
- `idx_category`: 分类索引
- `idx_created_at`: 创建时间索引
- `idx_title`: 标题索引
---
## 模糊搜索算法
### 算法特性
本项目采用基于 Python 的高性能模糊搜索算法,具备以下特性:
#### 1. 多种匹配算法
- **完全包含匹配**:优先级最高,精确匹配
- **WRatio 算法**:对中文友好的模糊比率匹配
- **部分比率匹配**:适用于长文本的部分匹配
- **Token 排序比率**:忽略词序的匹配
- **拼音匹配**:支持拼音搜索(如 "qianbao" 匹配 "钱包")
#### 2. 搜索字段
- 标题 (title)
- 描述 (description)
- 地点 (location)
- 分类 (category)
#### 3. 相似度阈值
| 阈值范围 | 匹配程度 | 使用场景 |
|---------|----------|----------|
| 90-100 | 几乎完全匹配 | 精确搜索 |
| 70-89 | 高度相似 | 标准搜索 |
| 60-69 | 中等相似 | 宽松搜索(默认) |
| 50-59 | 低相似度 | 超宽松搜索 |
| <50 | 不相关 | 不推荐 |
### 性能优化
- 使用 rapidfuzz 库(C++ 底层实现)
- 支持批量搜索
- 拼音转换结果缓存
- 结果按相似度排序
### 使用示例
```bash
# 中文搜索
curl "http://localhost:8080/api/public/items/search?keyword=钱包"
# 拼音搜索
curl "http://localhost:8080/api/public/items/search?keyword=qianbao"
# 调整阈值
curl "http://localhost:8080/api/public/items/search?keyword=手机&threshold=70"
```
详细文档请参考:[FUZZY_SEARCH_IMPLEMENTATION.md](./FUZZY_SEARCH_IMPLEMENTATION.md)
---
## 部署指南
### 开发环境
已在上面的[快速开始](#快速开始)部分说明。
### 生产环境部署
#### 1. 前端部署
```bash
cd front-end
# 构建微信小程序
npm run build:mp-weixin
# 上传至微信公众平台
# 使用微信开发者工具上传代码并提交审核
```
**微信小程序配置**:
1. 在微信公众平台配置服务器域名
2. 配置业务域名(如需使用 Web-view)
3. 设置合法域名(request、uploadFile、downloadFile)
#### 2. 后端部署
**方式一:直接部署**
```bash
cd back-end
# 构建可执行文件
go build -o lost-found-backend main.go
# 运行
./lost-found-backend
```
**方式二:使用 Docker**
```dockerfile
# Dockerfile 示例
FROM golang:1.19-alpine AS builder
WORKDIR /app
COPY . .
RUN go mod download
RUN go build -o main .
FROM alpine:latest
RUN apk --no-cache add ca-certificates python3 py3-pip
WORKDIR /root/
COPY --from=builder /app/main .
COPY --from=builder /app/algorithm ./algorithm
RUN pip3 install -r algorithm/requirements.txt
EXPOSE 8080
CMD ["./main"]
```
**方式三:宝塔面板部署**
1. 上传代码到服务器
2. 安装 Go 环境
3. 安装 Python 环境和依赖
4. 配置 Supervisor 守护进程
5. 配置 Nginx 反向代理
6. 配置 SSL 证书
#### 3. Nginx 配置示例
```nginx
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /uploads/ {
alias /path/to/uploads/;
}
}
```
#### 4. 数据库配置
```sql
-- 创建数据库用户(生产环境)
CREATE USER 'lost_found'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON lost_found.* TO 'lost_found'@'localhost';
FLUSH PRIVILEGES;
-- 导入数据表
USE lost_found;
SOURCE /path/to/database.sql;
```
#### 5. 环境变量配置
生产环境建议使用环境变量:
```bash
export APP_ENV=production
export DB_HOST=localhost
export DB_PORT=3306
export DB_NAME=lost_found
export DB_USER=lost_found
export DB_PASSWORD=strong_password
export JWT_SECRET=your-super-secret-key
export SERVER_PORT=8080
```
---
## 开发规范
### 代码规范
#### 前端
- 遵循 ESLint 规范
- 组件命名使用 PascalCase
- 文件命名使用 kebab-case
- 使用 Composition API(Vue 3)
#### 后端
- 遵循 Go 官方代码规范
- 使用 gofmt 格式化代码
- 包命名使用小写单词
- 导出函数使用大写字母开头
#### Python
- 遵循 PEP 8 规范
- 使用 4 空格缩进
- 函数命名使用 snake_case
### Git 提交规范
```
():