# WeChatMenu **Repository Path**: guo-yongchen/we-chat-menu ## Basic Information - **Project Name**: WeChatMenu - **Description**: 微信小程序后端服务 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-26 - **Last Updated**: 2022-05-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 小程序登录逻辑 1. 小程序调用wx.login()获取code 2. 小程序将code发送给服务器,同时将sessionId发送给服务器 3. 服务器获取sessionId,判断当前sessionId是否存在 1. 如果存在,则直接返回sessionId中对应的用户信息 2. 如果不存在,则进行登录或注册 4. 服务器调用微信接口获取openid和session_key > 其中的openid是唯一标识用户的,session_key是用来解密用户数据的(这个暂时用不到) 5. 服务器通过openid查询数据库,查看是否有对应的用户 1. 如果有,返回前端一个标识,表示用户已经注册并登录成功,将用户信息返回给前端 2. 如果没有,则返回前端一个标识,表示用户未注册 6. 前端通过标识判断是否已经注册 1. 如果已经注册,则将从服务器获取的用户信息显示到某个页面 2. 如果未注册,则调用wx.getUserInfo()获取用户信息,并将用户信息发送给服务器 > 小程序判断用户的状态,用户共有三种状态,分别是未注册、已注册但未登录、已登录 > > 注册与未注册通过R.flag=false来判断 > 已注册但未登录则R.flag=true > 已登录则R.flag=true > 已注册未登录与已登录的小程序操作相同 # 登录与注册的功能 ## 登录 如果微信本地存储有session信息,则直接将session信息返回给小程序而不进行数据库查询 > 如果用户的信息发生了改变,需要手动的进行更新用户信息或者修改用户信息,这个后期再说 如果小程序本地没有存储session信息,那么服务器会查询数据库,并将信息存储到session中,在将sessionID发给小程序 ## 注册 服务器进行判断,如果既没有session信息且在数据库中找不到相应的openid,那么进行注册,小程序获取用户的信息,将信息发给服务器,服务器吧信息存储到数据库 # E-R图 ![image-20220516211005580](image/image-20220516211005580.png) # 接口文档 > 接口公共ip地址:`http://123.60.210.186` > > 公共ip地址可能会发生变化,后期可能会用到https协议和域名 前后端通信协议字段含义解释: | 字段 | 类型 | 含义 | | :---: | :---: | :---: | | flag | boolean | 当前的操作是否成功,成功为true,失败为false | | login | boolean | 用户是否登录,一般在不涉及上传用户session的接口中无意义,用户登录为true,未登录为false | | **data** | **可以是任何类型** | **操作后返回的数据,就是获取的数据** | | sessionId | String | 当前用户的sessionId,一般只用于登录和注册功能中 | | message | String | 其他的提示信息 | 例如: ```json { "flag": true, "data": { "message": "获取的数据在这里......" }, "sessionId": "75D0CBA397DCB90C40DC322C3186F25B", "message": "登录成功", "login": false } ``` ## 登录接口 ### 接口地址 `公共ip/userinfos/login` ### 请求方式 POST ### 请求体参数 > 注意:只有一个参数,小程序code登录码 举例如下: ```json 073pKdml2obLc94I55ol2BeikN1pKdmV ``` ### 响应数据 sessionId是用户的sessionId信息,必须保存到本地,之后的有关用户的请求必须包含这个sessionId到服务器 login字段在这里无意义 data中的参数解释 | 字段 | 类型 | 含义 | | :---: | :---: | :---: | | id | Integer | 当前菜的id主键,唯一 | | openId | String | 小程序的唯一标识 | | sessionKey | String | 用于更加安全的登录校验,本项目中未使用,这一个字段可以直接忽略 | | avatarUrl | String | 用户头像地址链接 | | city | String | 用户城市 | | country | String | 用户国家 | | gender | Integer | 用户相别,0无,1男,2女 | | language | String | 用户语言 | | nickName | String | 用户昵称 | | province | String | 用户省份 | | deleted | Integer | 逻辑删除,这个在前端无意义,直接忽略 | 举例如下: ```json { "flag": true, "data": { "id": 20, "openid": "oVNdi5HsZGfeJpSDpN_7SdlxpnN0", "sessionKey": "", "avatarUrl": "https://thirdwx.qlogo.cn/mmopen/vi_32/anl3qgiaD4h6n3gO4lljUKibAfVfspNaLYNnareUPics3uDF1rPxnw9fMgg7ZiaHsz0ZzNjnnRcaMibcoBqw8ticWZbg/132", "city": "", "country": "", "gender": 0, "language": "zh_CN", "nickName": "小郭", "province": "", "deleted": 0 }, "sessionId": "75D0CBA397DCB90C40DC322C3186F25B", "message": "登录成功", "login": false } ``` ## 注册接口 ### 接口地址 `公共ip/userinfos/register` ### 请求方式 POST ### url参数 | 字段 | 类型 | 含义 | | :---: | :---: | :---: | | code | String | 小程序的code码 | 举例如下: ``` 公共ip/userinfos/register?code=073o8FGa1sVvcD0i0qHa1smdZ70o8FGC ``` ### 请求体参数 小程序获取的用户的信息 举例如下: ```json { "nickName": "小郭", "gender": 0, "language": "zh_CN", "city": "", "province": "", "country": "", "avatarUrl": "https://thirdwx.qlogo.cn/mmopen/vi_32/anl3qgiaD4h6n3gO4lljUKibAfVfspNaLYNnareUPics3uDF1rPxnw9fMgg7ZiaHsz0ZzNjnnRcaMibcoBqw8ticWZbg/132" } ``` ### 响应数据 通过flag字段判断用户是否已经注册,true表示注册成功,false表示用户已经注册了 ```json { "flag": true, "data": null, "sessionId": null, "message": "注册成功", "login": false } ``` ```json { "flag": false, "data": null, "sessionId": null, "message": "注册失败,用户已存在", "login": false } ``` ## 登出 ### 接口地址 `公共ip/userinfos/logout` ### 请求方式 GET ### 请求头参数 需要指定登出用户的session 举例如下: ```json header: { Cookie: "JSESSIONID=D636B1E6375FB97FA69FA12FFE582059" } ``` ### 响应数据 通过flag字段判断操作是否成功 ```json { "flag": false, "data": null, "sessionId": null, "message": "登出失败,session不存在或已经销毁", "login": false } ``` ```json { "flag": true, "data": null, "sessionId": null, "message": "登出成功", "login": false } ``` > 登出后会销毁当前用户在服务器端的session信息 ## 获取所有类别信息接口 获取所有的菜品类别以及制作工具,根据classify字段排序 ### 接口地址 `公共ip/categories` ### 请求方式 GET ### 响应数据 data信息解释 | 字段 | 类型 | 含义 | | :---: | :---: | :---: | | id | Integer | 主键,唯一 | | name | String | 名称 | | classify | Integer | 类别:1表示素菜,2表示荤菜,3表示主食,4表示制作工具 | | image | String | 图标地址 | 下面是举例: ```json { "flag": true, "data": [{ "id": 2, "name": "胡萝卜", "classify": 1, "image": "http://123.60.210.186:8080/resources/pictures/categories/2.png" }, { "id": 17, "name": "香肠", "classify": 2, "image": "http://123.60.210.186:8080/resources/pictures/categories/17.png" }, { "id": 26, "name": "面包", "classify": 3, "image": "http://123.60.210.186:8080/resources/pictures/categories/26.png" }, { "id": 33, "name": "一口大锅", "classify": 4, "image": "http://123.60.210.186:8080/resources/pictures/categories/33.png" }], "sessionId": null, "message": "查询成功", "login": false } ``` ## 获取所有的菜单信息 ### 接口地址 `公共ip/menus` ### 请求方式 GET ### 响应数据 data字段解释 | 字段 | 类型 | 含义 | | :---: | :---: | :---: | | id | Integer | 主键,唯一 | | name | String | 菜名 | | stuff | String | 素菜,荤菜与主食的标签。中不同的标签中间用`、`中文顿号间隔 | | link | String | b站链接 | | difficulty | String | 制作难以程度 | | tags | String | 简述 | | methods | String | 制作方式 | | tools | String | 使用工具,每种工具之间用`、`中文顿号间隔 | | deleted | Integer | 逻辑删除(这个不用管) | | description | String | 菜的详细描述 | | myLink | String | 项目服务中的视频连接地址,这个地址可以在小程序中直接使用 | | clickCount | Integer | 点击量(在此接口中不进行查询,无意义) | | praiseCount | Integer | 点赞量(在此接口中不进行查询,无意义) | | collectionCount | Integer | 收藏量(在此接口中不进行查询,无意义) | | isPraise | Boolean | 当前用户是否对其点赞(在此接口中,这个字段无意义) | | isCollection | Boolean | 当前用户是否收藏(在此接口中,这个字段无意义) | 举例如下: ```json { "flag": true, "data": [ { "id": 2000, "name": "电饭煲版广式腊肠煲饭", "stuff": "腊肠、米", "link": "https://www.bilibili.com/video/BV1NE411Q7Jj", "difficulty": "简单", "tags": "广式", "methods": "煲", "tools": "电饭煲", "deleted": 0, "description": null, "myLink": null, "clickCount": null, "praiseCount": null, "collectionCount": null, "isPraise": null, "isCollection": null }, { "id": 2001, "name": "电饭煲版烧鸡", "stuff": "鸡肉、洋葱、菌菇", "link": "https://www.bilibili.com/video/BV1T54y1U7Cu", "difficulty": "简单", "tags": "好吃", "methods": "", "tools": "电饭煲", "deleted": 0, "description": null, "myLink": null, "clickCount": null, "praiseCount": null, "collectionCount": null, "isPraise": null, "isCollection": null } ], "sessionId": null, "message": "操作成功", "login": false } ``` ## 根据材料和制作工具模糊查询 ### 接口地址 `公共ip/menus/like/菜品信息/制作工具信息` > 注意:此接口在2022年5月16日被更新,原来的接口地址不在使用 > > 原来的地址:`公共ip/menus/菜品信息/制作工具信息` > > 请在小程序index.js中大约68行进行修改:参考如下代码: > > ```javascript > // 模糊查询 > wx.request({ > // 在此处进行修改 > url: app.globalData.serverHostLocation + "/menus/like/" + stuff + "/" + tools, > method: "GET", > success: res => { > console.log(res); > // 设置数据 > this.setData({ > menus: res.data.data > }); > } > }); > ``` ### 请求方式 GET ### Restful风格参数 菜品信息和制作工具如果有多个,中间用英文逗号间隔`,` ### 响应数据 例如:查询原材料中包括米和胡萝卜,以及制作工具是电饭煲的菜单信息`http://123.60.210.186/menus/like/胡萝卜,腊肠,面食/烤箱` data数据解释 | 字段 | 类型 | 含义 | | :---: | :---: | :---: | | id | Integer | 主键,唯一 | | name | String | 菜名 | | stuff | String | 素菜,荤菜与主食的标签。中不同的标签中间用`、`中文顿号间隔 | | link | String | b站链接 | | difficulty | String | 制作难以程度 | | tags | String | 简述 | | methods | String | 制作方式 | | tools | String | 使用工具,每种工具之间用`、`中文顿号间隔 | | deleted | Integer | 逻辑删除(这个不用管) | | description | String | 菜的详细描述 | | myLink | String | 项目服务中的视频连接地址,这个地址可以在小程序中直接使用 | | clickCount | Integer | 点击量(在此接口中不进行查询,无意义) | | praiseCount | Integer | 点赞量(在此接口中不进行查询,无意义) | | collectionCount | Integer | 收藏量(在此接口中不进行查询,无意义) | | isPraise | Boolean | 当前用户是否对其点赞(在此接口中,这个字段无意义) | | isCollection | Boolean | 当前用户是否收藏(在此接口中,这个字段无意义) | ```json { "flag": true, "data": [ { "id": 2046, "name": "烤箱烧烤", "stuff": "土豆、胡萝卜、花菜、西葫芦、芹菜、洋葱、莴笋、菌菇、茄子、包菜、午餐肉、香肠、鸡肉、猪肉、虾、牛肉、鸡肉", "link": "https://www.bilibili.com/video/BV17P4y1W7Ze", "difficulty": "", "tags": "杂烩", "methods": "", "tools": "烤箱", "deleted": 0, "description": "食材:黑椒石头烤肠,辣椒粉,孜然粉,白芝麻,白糖,蚝油.\n\n做法:在烤盘上涂.上一层油,烤肠改刀放在烤盘上,放入烤箱180度烤10分钟。\n\n加入1勺辣椒粉,1勺孜然粉,1勺白芝麻,淋上热油,再放入半勺白糖,-勺蚝油,搅拌均匀备用\n\n拿出烤肠,涂上调好的沾料,可以开动啦!", "myLink": "http://123.60.210.186:8080/resources/videos/menus/2046.mp4", "clickCount": null, "praiseCount": null, "collectionCount": null, "isPraise": null, "isCollection": null }, { "id": 2060, "name": "烤箱版黑椒牛肉土豆焖饭", "stuff": "牛肉、土豆、胡萝卜、米、鸡蛋", "link": "https://www.bilibili.com/video/BV14x411D7uN", "difficulty": "", "tags": "", "methods": "", "tools": "烤箱", "deleted": 0, "description": null, "myLink": "http://123.60.210.186:8080/resources/videos/menus/2060.mp4", "clickCount": null, "praiseCount": null, "collectionCount": null, "isPraise": null, "isCollection": null }, { "id": 2073, "name": "烤箱腊肠焖饭", "stuff": "腊肠、花菜、米", "link": "https://www.bilibili.com/video/BV14x411D7uN", "difficulty": "", "tags": "", "methods": "", "tools": "烤箱", "deleted": 0, "description": null, "myLink": null, "clickCount": null, "praiseCount": null, "collectionCount": null, "isPraise": null, "isCollection": null }, { "id": 2093, "name": "土豆杂蔬烘蛋", "stuff": "土豆、番茄、胡萝卜、香肠", "link": "https://www.bilibili.com/video/BV1Y5411S7mu", "difficulty": "简单", "tags": "早餐", "methods": "烘", "tools": "烤箱、空气炸锅", "deleted": 0, "description": "[食材]\n可生食鸡蛋2个、煮蛋1个、mini小香肠5个、牛奶30ml、土豆130g、速冻青豆玉米粒共40g。\n[做法]:\n土豆去皮切丁,煮熟,水开后大概煮10分钟。\n小香肠切小丁,留一根备用。\n两个鸡蛋+牛奶+海盐+黑胡椒碎打散。\n3准备一个15厘米的烤碗,垫烘培纸。放青豆玉米粒、香肠、土豆拌匀,倒入蛋液,最后码造型,一个煮蛋切两半再加一根香肠。( 这一步还可以加一些芝士碎,口味更丰富! )\n4预热烤箱180度烤30分钟,蛋黄上可覆盖一-层锡纸,烤出的蛋黄不会太干。", "myLink": "http://123.60.210.186:8080/resources/videos/menus/2093.mp4", "clickCount": null, "praiseCount": null, "collectionCount": null, "isPraise": null, "isCollection": null } ], "sessionId": null, "message": "操作成功", "login": false } ``` ## 对某个菜加一点击量 ### 地址 `公共ip/clicks` ### 请求方式 POST ### 请求头参数 需要携带用户的sessionid 举例如下: ```json header: { Cookie: "JSESSIONID=D636B1E6375FB97FA69FA12FFE582059" } ``` ### 请求体参数 要对那一道才点击,就传那一道才的id 举例如下: ``` 2046 ``` ### 响应数据 login表示用户是否登录,flag表示操作是否成功 ```json { "flag": true, "data": null, "sessionId": null, "message": "点击量加一成功", "login": true } ``` ```json { "flag": false, "data": null, "sessionId": null, "message": "用户未登录", "login": false } ``` > 如果提示用户没有登录,则需要引导用户进行登录。用户必须登录才能有此功能 ## 查询所有菜,通过点击量排序 ### 接口地址 `公共ip/menus/order` ### 请求方式 GET ### 响应数据 data数据解释: | 字段 | 类型 | 含义 | | :---: | :---: | :---: | | id | Integer | 主键,唯一 | | name | String | 菜名 | | stuff | String | 素菜,荤菜与主食的标签。中不同的标签中间用`、`中文顿号间隔 | | link | String | b站链接 | | difficulty | String | 制作难以程度 | | tags | String | 简述 | | methods | String | 制作方式 | | tools | String | 使用工具,每种工具之间用`、`中文顿号间隔 | | deleted | Integer | 逻辑删除(这个不用管) | | description | String | 菜的详细描述 | | myLink | String | 项目服务中的视频连接地址,这个地址可以在小程序中直接使用 | | ***clickCount*** | ***Integer*** | ***点击量*** | | praiseCount | Integer | 点赞量(在此接口中不进行查询,无意义) | | collectionCount | Integer | 收藏量(在此接口中不进行查询,无意义) | | isPraise | Boolean | 当前用户是否对其点赞(在此接口中,这个字段无意义) | | isCollection | Boolean | 当前用户是否收藏(在此接口中,这个字段无意义) | ```json { "flag": true, "data": [{ "id": 2046, "name": "烤箱烧烤", "stuff": "土豆、胡萝卜、花菜、西葫芦、芹菜、洋葱、莴笋、菌菇、茄子、包菜、午餐肉、香肠、鸡肉、猪肉、虾、牛肉、鸡肉", "link": "https://www.bilibili.com/video/BV17P4y1W7Ze", "difficulty": "", "tags": "杂烩", "methods": "", "tools": "烤箱", "deleted": 0, "description": "食材:黑椒石头烤肠,辣椒粉,孜然粉,白芝麻,白糖,蚝油.\n\n做法:在烤盘上涂.上一层油,烤肠改刀放在烤盘上,放入烤箱180度烤10分钟。\n\n加入1勺辣椒粉,1勺孜然粉,1勺白芝麻,淋上热油,再放入半勺白糖,-勺蚝油,搅拌均匀备用\n\n拿出烤肠,涂上调好的沾料,可以开动啦!", "myLink": "http://123.60.210.186:8080/resources/videos/menus/2046.mp4", "clickCount": 37, "praiseCount": null, "collectionCount": null, "isPraise": null, "isCollection": null }, { "id": 2001, "name": "电饭煲版烧鸡", "stuff": "鸡肉、洋葱、菌菇", "link": "https://www.bilibili.com/video/BV1T54y1U7Cu", "difficulty": "简单", "tags": "好吃", "methods": "", "tools": "电饭煲", "deleted": 0, "description": null, "myLink": null, "clickCount": 31, "praiseCount": null, "collectionCount": null, "isPraise": null, "isCollection": null } ], "sessionId": null, "message": "查询成功", "login": false } ``` ## 根据不同性别,查询最受欢迎的菜 ### 接口地址 `公共ip/menus/order/性别` ### 请求方式 GET ### url参数 性别其中,0:未知,1:男,2:女 举例如下:查询男生最受欢迎的菜 ``` http://localhost/menus/order/1 ``` ### 响应数据 举例:查询女生最受欢迎的菜`http://123.60.210.186/menus/order/2` data解释: | 字段 | 类型 | 含义 | | :---: | :---: | :---: | | id | Integer | 主键,唯一 | | name | String | 菜名 | | stuff | String | 素菜,荤菜与主食的标签。中不同的标签中间用`、`中文顿号间隔 | | link | String | b站链接 | | difficulty | String | 制作难以程度 | | tags | String | 简述 | | methods | String | 制作方式 | | tools | String | 使用工具,每种工具之间用`、`中文顿号间隔 | | deleted | Integer | 逻辑删除(这个不用管) | | description | String | 菜的详细描述 | | myLink | String | 项目服务中的视频连接地址,这个地址可以在小程序中直接使用 | | ***clickCount*** | ***Integer*** | ***点击量*** | | praiseCount | Integer | 点赞量(在此接口中不进行查询,无意义) | | collectionCount | Integer | 收藏量(在此接口中不进行查询,无意义) | | isPraise | Boolean | 当前用户是否对其点赞(在此接口中,这个字段无意义) | | isCollection | Boolean | 当前用户是否收藏(在此接口中,这个字段无意义) | ```json { "flag": true, "data": [ { "id": 2000, "name": "电饭煲版广式腊肠煲饭", "stuff": "腊肠、米", "link": "https://www.bilibili.com/video/BV1NE411Q7Jj", "difficulty": "简单", "tags": "广式", "methods": "煲", "tools": "电饭煲", "deleted": 0, "description": null, "myLink": null, "clickCount": 6, "praiseCount": null, "collectionCount": null, "isPraise": null, "isCollection": null }, { "id": 2011, "name": "电饭煲版可乐鸡翅", "stuff": "鸡肉", "link": "https://www.bilibili.com/video/BV16J411U79k", "difficulty": "", "tags": "", "methods": "", "tools": "电饭煲", "deleted": 0, "description": null, "myLink": null, "clickCount": 1, "praiseCount": null, "collectionCount": null, "isPraise": null, "isCollection": null } ], "sessionId": null, "message": "查询成功", "login": false } ``` ## 根据菜id查询这个菜的详细信息 ### 接口地址 `公共ip/menus/菜id` > 注意: > > 旧版接口`公共ip/menus/one/菜id`已停用 > > 请在小程序course.js的39行附近进行修改,参考如下: > > ```javascript > url: getApp().globalData.serverHostLocation + '/menus/' + currentMenuId, > header: getApp().globalData.header, > method: "GET", > ``` ### 请求方式 GET ### Restful风格参数 在接口后面拼接上要查询的菜的id,例如查询菜id为2046的详细信息 ``` http://localhost/menus/2046 ``` ### 请求头参数 需要携带用户的sessionid 举例如下: ```json header: { Cookie: "JSESSIONID=D636B1E6375FB97FA69FA12FFE582059" } ``` ### 响应数据 data数据解释: | 字段 | 类型 | 含义 | | :---: | :---: | :---: | | id | Integer | 主键,唯一 | | name | String | 菜名 | | stuff | String | 素菜,荤菜与主食的标签。中不同的标签中间用`、`中文顿号间隔 | | link | String | b站链接 | | difficulty | String | 制作难以程度 | | tags | String | 简述 | | methods | String | 制作方式 | | tools | String | 使用工具,每种工具之间用`、`中文顿号间隔 | | deleted | Integer | 逻辑删除(这个不用管) | | description | String | 菜的详细描述 | | myLink | String | 项目服务中的视频连接地址,这个地址可以在小程序中直接使用 | | ***clickCount*** | ***Integer*** | ***点击量*** | | ***praiseCount*** | ***Integer*** | ***点赞量*** | | ***collectionCount*** | ***Integer*** | ***收藏量*** | | ***isPraise*** | ***Boolean*** | ***当前用户是否对其点赞*** | | ***isCollection*** | ***Boolean*** | ***当前用户是否收藏*** | 举例如下:访问接口`http://localhost/menus/2046`查询到如下信息: flag表示查询是否成功,login表示用户是否登录,用户必须登录才能进行查询 ```json { "flag": true, "data": { "id": 2046, "name": "烤箱烧烤", "stuff": "土豆、胡萝卜、花菜、西葫芦、芹菜、洋葱、莴笋、菌菇、茄子、包菜、午餐肉、香肠、鸡肉、猪肉、虾、牛肉、鸡肉", "link": "https://www.bilibili.com/video/BV17P4y1W7Ze", "difficulty": "", "tags": "杂烩", "methods": "", "tools": "烤箱", "deleted": 0, "description": "食材:黑椒石头烤肠,辣椒粉,孜然粉,白芝麻,白糖,蚝油.\n\n做法:在烤盘上涂.上一层油,烤肠改刀放在烤盘上,放入烤箱180度烤10分钟。\n\n加入1勺辣椒粉,1勺孜然粉,1勺白芝麻,淋上热油,再放入半勺白糖,-勺蚝油,搅拌均匀备用\n\n拿出烤肠,涂上调好的沾料,可以开动啦!", "myLink": "http://123.60.210.186:8080/resources/videos/menus/2046.mp4", "clickCount": 39, "praiseCount": 2, "collectionCount": 2, "isPraise": false, "isCollection": false }, "sessionId": null, "message": "查询成功", "login": true } ```