# takeout_api_server **Repository Path**: sagit_zh/takeout_api_server ## Basic Information - **Project Name**: takeout_api_server - **Description**: 外卖api,基于node.js,mysql数据库 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2021-06-25 - **Last Updated**: 2025-03-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 外卖商城前后端全栈项目 ## 总览 麻雀虽小,五脏俱全。这是一个功能不多,但趋近完整的全栈项目 ## 项目组成部分 ### [Mysql 数据库](https://gitee.com/sagit_zh/takeout_api_server/tree/master/db) ### [Nodejs 服务器](https://gitee.com/sagit_zh/takeout_api_server) - Nodejs + Express + SQL - [接口文档地址](https://gitee.com/sagit_zh/takeout_api_server/blob/master/README.md) ### [uniapp 用户移动端](https://gitee.com/sagit_zh/taokeout_mobile) (商品展示 + 电商闭环) - uniapp + uViewUI + vuex - 包含后端数据面向用户的设计展示、电商下单闭环实现、跨平台注册登录校验 - [部分页面截图展示](https://gitee.com/sagit_zh/taokeout_mobile/tree/master/demo) ### [vue2 后台管理端](https://gitee.com/sagit_zh/takeout_admin) (维护管理用户、商家、订单) - [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) (基于此后台管理模板) - vue2 + vuex + ElementUI + Mock - 包含基本的 CRUD、文件上传、echars图标展示、RBAC权限分配 ## 功能 ``` - 登录 / 注册 / 注销 - 账号密码 - 手机验证短信 - 邮箱验证 - 微信验证 - CRUD 增删查改 - 用户 - 商品 - 分类 - 店铺 - 订单 - 轮播图 - 其他 - 图片上传 - 文件上传 - 数据统计报表 - 权限分配 ``` # 1. 外卖接口文档 ## 1.1 API V1 接口说明 - 接口基准地址:`http://127.0.0.1:9120/api/private/v1/` - 服务端已开启 CORS 跨域支持 - `/api/private/v1/` 认证统一使用 Token 认证 - 需要授权的 API ,必须在请求头中使用 `Authorization` 字段提供 `token` 令牌 - 使用 HTTP Status Code 标识状态 - 数据返回格式统一使用 JSON ### 1.1.1. 支持的请求方法 - GET:查 - POST:增、删、改 ### 1.1.2. 通用返回状态说明 | *状态码* | *含义* | *说明* | | -------- | --------------------- | --------------------------------------------------- | | 200 | OK | get - 请求成功 | | 201 | CREATED | add - 创建成功 | | 202 | UPDATE | edit - 修改成功 | | 205 | DELETED | del - 删除成功 | | 400 | BAD REQUEST | 请求的地址不存在或者包含不支持的参数 | | 401 | UNAUTHORIZED | 未授权,需要token | | 403 | FORBIDDEN | 被禁止访问 | | 404 | NOT FOUND | 请求的资源不存在 | | 422 | Unprocesable entity | [POST] 当创建一个对象时,发生一个验证错误 | | 500 | INTERNAL SERVER ERROR | 内部错误 | ## 1.2 用户登录注册 - 请求基路径:`/login` - Token 认证:不需要 ### 1.2.1 用户登录接口 ##### 请求URL - ` / ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--| |username |是 |string |用户名 |-| |password |是 |string | 密码 |-| ##### 返回示例 ``` { "msg": "登陆成功", "code": 200, "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTQsImlhdCI6MTYyNDgxNjAzOSwiZXhwIjoxNjI0ODE5NjM5fQ._RnnqOrzkBtGy-Ihs6nMfJ78OB4wFLDPD68xXMY808U" } } ``` ##### 返回参数说明 |参数名|类型|说明| |:----- |:-----|----- | |token |string |会话凭证,有效时间一小时 | ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.2.1 用户注册接口 ##### 请求URL - ` /register ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- | -- | |username |是 |string |用户名 |-| |password |是 |string | 密码 |-| ##### 返回示例 ``` { "msg": "注册成功,登录账号:18028104328", "code": 200 } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ## 1.3 用户管理 - 请求基路径:`/users` - Token 认证:需要 ### 1.2.1 获取全部 ##### 请求URL - ` /get ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值 |:---- |:---|:----- |----- |--| |pagenum |否 |number | 页码|1 | |pagesize |否 |number | 页容量|10 | ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "data": { "users": [...], "total": 6, "pagenum": 1, "totalPage": 1 } } ``` ##### 返回参数说明 |参数名|类型|说明| |:----- |:-----|----- | |users |array |用户列表 | |total |number |总用户数量 | |pagenum |number |当前页码 | |totalPage |number |总页数(以pagesize为基准) | ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.2.2 根据账号获取 ##### 请求URL - ` /get ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--| |username |否 |number | 用户账号,为空匹配全部 |-| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "data": { "users": [{ "user_id": 1, "username": "18010000000", "password": "$2a$08$lV0Gr4AKx7xH7cCU4KCGCOikNzGPaWIpw9W7A9BONIxoJ2.hGC9qi", "nickname": "zce", "user_email": "w@zce.me", "status": "正常", "user_sex": "男", "user_tel": "", "user_introduce": null, "create_time": "2017-11-30T09:12:09.000Z", "update_time": "2017-11-30T09:12:09.000Z", "user_wechat": "" }], "total": 6, "pagenum": 1, "totalPage": 1 } } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.2.3 根据ID获取 ##### 请求URL - ` /getById ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |-----|--- | |id |是 |number | 主键用户id |-| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "data": [ { "user_id": 1, "username": "18010000000", "password": "$2a$08$lV0Gr4AKx7xH7cCU4KCGCOikNzGPaWIpw9W7A9BONIxoJ2.hGC9qi", "nickname": "zce", "user_email": "w@zce.me", "status": "正常", "user_sex": "男", "user_tel": "", "user_introduce": null, "create_time": "2017-11-30T09:12:09.000Z", "update_time": "2017-11-30T09:12:09.000Z", "user_wechat": "" } ] } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.2.4 修改信息 ##### 请求URL - ` /edit ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--| |id |是 |number | 主键用户id |-| |username|否|string|登录账号(11位手机)|-| |password|否|string|登录密码(md5)|-| |nickname|否|string|用户名|-| |user_email|否|string|邮箱|-| |user_sex|否|string|性别('保密','男','女')|保密| |user_tel|否|number|手机|-| |user_introduce|否|string|个人简介|-| |user_wechat|否|string|微信|-| ##### 返回示例 ``` { "msg": "修改成功", "code": 200, } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.2.5 删除 ##### 请求URL - ` /delete ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |-- | |id |是 |number | 主键用户id |- | ##### 返回示例 ``` { "msg": "删除成功", "code": 200, } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ## 1.3 商品管理 - 请求基路径:`/goods` - Token 认证:需要 ### 1.3.1 获取全部 ##### 请求URL - ` /get ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |pagenum |否 |number | 页码 |1| |pagesize |否 |number | 页容量 |10| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "goods":[...], "total": 6, "pagenum": 1, "totalPage": 1 } ``` ##### 返回参数说明 |参数名|类型|说明| |:----- |:-----|----- | |goods |array |商品列表 | |total |number |总商品数量 | |pagenum |number |当前页码 | |totalPage |number |总页数(以pagesize为基准) | ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.3.2 根据名获取 ##### 请求URL - ` /get ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |goods_name |是 |string | 商品名,已开启模糊匹配 |-| |pagenum |否 |number | 页码 |1| |pagesize |否 |number | 页容量 |10| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "goods":[...], "total": 6, "pagenum": 1, "totalPage": 1 } ``` ##### 备注 - 支持模糊匹配 ### 1.3.3 根据ID获取 ##### 请求URL - ` /getById ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |goods_id |是 |number | 商品ID |-| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "goods":[1], } ``` ### 1.3.4 根据分类ID获取 ##### 请求URL - ` /getByCategoryId ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |category_id |是 |number | 分类ID |-| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "goods":[...] } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.3.5 添加 ##### 请求URL - ` /add ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |shop_id |是 |number | 所属店铺ID |-| |goods_name |是 |string | 商品名 |-| |goods_price |是 |number | 商品价格 |-| |category_id |是 |number | 所属分类ID |-| ##### 返回示例 ``` { "msg": "添加成功", "code": 200, } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.3.6 修改信息 ##### 请求URL - ` /edit ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--| |id |是 |number | 商品id |-| |category_id|否|string|所属分类|-| |goods_name|否|string|商品名|-| |goods_price|否|number|商品价格|-| |goods_info|否|string|商品描述|-| |goods_img|否|string|商品图片|有默认图| ##### 返回示例 ``` { "msg": "修改成功", "code": 200, } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.3.7 删除 ##### 请求URL - ` /delete ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |-- | |id |是 |number | 商品id |- | ##### 返回示例 ``` { "msg": "删除成功", "code": 200, } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ## 1.4 分类管理 - 请求基路径:`/categories` - Token 认证:需要 ### 1.4.1 获取全部 ##### 请求URL - ` /get ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |pagenum |否 |number | 页码 |1| |pagesize |否 |number | 页容量 |10| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "categories":[...], "total": 6, "pagenum": 1, "totalPage": 1 } ``` ##### 返回参数说明 |参数名|类型|说明| |:----- |:-----|----- | |categories |array |分类列表 | |total |number |总分类数量 | |pagenum |number |当前页码 | |totalPage |number |总页数(以pagesize为基准) | ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.4.2 根据名获取 ##### 请求URL - ` /get ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |category_name |是 |string | 分类名,已开启模糊匹配 |-| |pagenum |否 |number | 页码 |1| |pagesize |否 |number | 页容量 |10| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "categories":[...], "total": 6, "pagenum": 1, "totalPage": 1 } ``` ##### 备注 - 支持模糊匹配 ### 1.4.3 根据ID获取 ##### 请求URL - ` /getById ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |category_id |是 |number | 分类ID |-| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "categories":[1], } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.4.4 添加 ##### 请求URL - ` /add ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |category_name |是 |string | 分类名 |-| ##### 返回示例 ``` { "msg": "添加成功", "code": 200, } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ## 1.5 店铺管理 - 请求基路径:`/shops` - Token 认证:需要 ### 1.5.1 获取全部 ##### 请求URL - ` /get ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |pagenum |否 |number | 页码 |1| |pagesize |否 |number | 页容量 |10| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "shops":[...], "total": 60, "pagenum": 1, "totalPage": 1 } ``` ##### 返回参数说明 |参数名|类型|说明| |:----- |:-----|----- | |shops |array |店铺列表 | |total |number |总分类数量 | |pagenum |number |当前页码 | |totalPage |number |总页数(以pagesize为基准) | ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.5.2 根据名获取 ##### 请求URL - ` /get ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |shop_name |是 |string | 店铺名,已开启模糊匹配 |-| |pagenum |否 |number | 页码 |1| |pagesize |否 |number | 页容量 |10| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "shops":[...], "total": 6, "pagenum": 1, "totalPage": 1 } ``` ##### 备注 - 支持模糊匹配 ### 1.5.3 根据类型获取 ##### 请求URL - ` /get ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |shop_product |是 |string | 店铺类型('高汤粉面','经典饭食','小吃炸鸡','奶茶甜品'),已开启模糊匹配 |-| |pagenum |否 |number | 页码 |1| |pagesize |否 |number | 页容量 |10| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "shops":[...], "total": 6, "pagenum": 1, "totalPage": 1 } ``` ##### 备注 - 支持模糊匹配 ### 1.5.4 根据配送方式获取 ##### 请求URL - ` /get ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |delivery_method |是 |string | 配送方式('商家自送','平台配送') |-| |pagenum |否 |number | 页码 |1| |pagesize |否 |number | 页容量 |10| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "shops":[...], "total": 6, "pagenum": 1, "totalPage": 1 } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.5.5 根据饭堂位置获取 ##### 请求URL - ` /get ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |shop_floor |是 |string | 饭堂位置('荷苑','竹苑','桃苑') |-| |pagenum |否 |number | 页码 |1| |pagesize |否 |number | 页容量 |10| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "shops":[...], "total": 6, "pagenum": 1, "totalPage": 1 } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.5.6 根据ID获取 ##### 请求URL - ` /getById ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |shop_id |是 |number | 店铺ID |-| ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "shops":[1], } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.5.7 新增 ##### 请求URL - ` /add ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |shop_id |是 |number | 所属店铺ID |-| |shop_tel |是 |string | 商品名 |-| ##### 返回示例 ``` { "msg": "添加成功", "code": 200, } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.5.8 修改信息 ##### 请求URL - ` /edit ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--| |id |是 |number | 店铺id |-| |shop_name|否|string|店铺名|-| |shop_tel|否|number|店铺账号/手机|-| |shop_product|否|string|店铺类型|-| |shop_floor|否|string|店铺位置|-| |avatar_url|否|string|店铺头像|有默认图| |initial_price|否|number|起步价|-| |delivery_method|否|string|商品图片|-| |status|否|string|店铺状态|-| ##### 返回示例 ``` { "msg": "修改成功", "code": 200, } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ### 1.5.7 删除 ##### 请求URL - ` /delete ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |-- | |id |是 |number | 店铺id |- | ##### 返回示例 ``` { "msg": "删除成功", "code": 200, } ``` ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ## 1.6 订单管理 > 暂无 ## 1.7 图片上传 - Token 认证:需要 ##### 请求URL - ` /upload ` ##### 请求方式 - POST ##### 参数 |类型|关键字|必传|说明| |:---|:--|:--|:-----| |formdata|file|是|formdata.append('file')| ##### 返回示例 ``` { "msg": "上传成功", "code": 200, "data": { "path": "uploads/day_01-1625833777748.png" } } ``` ##### 返回参数说明 |参数名|类型|说明| |:----- |:-----|----- | |path |string |上传的资源路径 | ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ## 1.8 获取轮播图 - Token 认证:不需要 ##### 请求URL - ` /banner ` ##### 请求方式 - GET ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "data": { "banner": [ { "banner_id": 1, "banner_url": "uploads/shuangshiyi-1626245635830.jpg" }, { "banner_id": 2, "banner_url": "uploads/xiadanbikan-1626245825902.png" }, { "banner_id": 3, "banner_url": "uploads/xinrenhaoli-1626245799242.png" } ] } } ``` ##### 返回参数说明 |参数名|类型|说明| |:----- |:-----|----- | |banner_id |number |轮播图id | |banner_url |string |轮播图路径 | ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ## 1.9 获取栏目 ##### 请求URL - `/tabs/get` ##### 请求方式 - GET ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "data": { "tabs": [ { "tab_name": "店长推荐", "tab_id": 1 } ] } } ``` ##### 返回参数说明 |参数名|类型|说明| |:----- |:-----|----- | |tab_name| string |栏目标题| |tab_id |number |栏目id| ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ## 1.10 获取公告 ##### 请求URL - `/notice/get` ##### 请求方式 - GET ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "data": { "notices": [ { "notice": "", "notice_id": 1 } ] } } ``` ##### 返回参数说明 |参数名|类型|说明| |:----- |:-----|----- | |notice| string |公告内容| |notice_id |number |公告id| ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ## 1.11 获取店铺分类 ##### 请求URL - `/product/get` ##### 请求方式 - GET ##### 返回示例 ``` { "msg": "获取成功", "code": 200, "data": { "product": [ { "product_name": "经典饭食", "product_id": 1, "product_icon": "mifan-" } ] } } ``` ##### 返回参数说明 |参数名|类型|说明| |:----- |:-----|----- | |product_name| string |标题| |product_id |number |id| |product_icon |number |分类图标| ##### 备注 - 更多返回错误代码请看首页的错误代码描述 ## 1.12 手机验证码 - 请求基路径:`/msg` - Token 认证:不需要 ### 1.12.1 发送验证码 ##### 请求URL - ` / ` ##### 请求方式 - GET ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |phone |是 |number | 手机号码 |-| - 手机校验正则:`/^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/` ##### 返回示例 ``` { "msg": "短信验证码已发送", "code": 200, "data": { "cipherText": "U2FsdGVkX19xUYS8ipEcUZLckFzjLafA", "createTime": 1628235647918 } } ``` ##### 返回参数说明 |参数名|类型|说明| |:----- |:-----|----- | |cipherText |string |des密文,校验用 | |createTime |string |发送时间,五分钟内有效 | ##### 备注 - 验证码五分钟内有效 ### 1.12.2 通过验证码一键登录注册 ##### 请求URL - ` /login ` ##### 请求方式 - POST ##### 参数 |参数名|必选|类型|说明|默认值| |:---- |:---|:----- |----- |--- | |phone |是 |number | 手机号码 |-| |createTime |是 |number | 发送时间 |-| |cipherText |是 |number | des密文 |-| |plainText |是 |number | 验证码明文 |-| ##### 返回示例 ``` { "msg": "登录成功", "code": 200, "data": { "token": 1231343451 } } ``` ##### 备注 - 验证码五分钟内有效 ## 1.13 用户权限管理 > 暂无 ## 1.14 数据统计 > 暂无