接口须知
后端技术栈
- Spring
- SpringBoot
- junit
- aliyun-oss
- spring-session
- mysql
- lombok
- hutool-http
- fastjson
- mybatis-plus
- JWT
- pagehelper
- jackson
- aspectjrt
关于响应结果
- 返回数据采用统一响应结果
{
"code":200,
"msg":"操作成功",
"data":...
}
code
为int
类型,表示响应码:200成功,4xx客户端错误,5xx服务器错误msg
为String类型,表示提示信息data
类型不限,是后端返回的数据
关于权限校验
- 在初始开发阶段,不对接口进行权限校验。
- 接口的权限校验基于SpringSecurity和JWT。
- 在登录后收到JWT令牌,存入本地存储。
- 此后所有的接口访问都需要在请求头(Header)中添加Authorization参数
- Authorization的内容为:Bearer
- 后端在收到令牌后会对请求的身份进行校验。
- 若校验不通过,则返回如下数据:
{
"code": 500,
"msg": "NO_LOGIN",
"data": null
}
关于会话验证
- 考虑到跨域请求的问题,不使用传统session和cookie进行验证是否为同一请求。
- 使用jwt技术和redis相结合进行会话校验。
- 所以在第一次请求后一定会包含sessionId或者token来标识客户端,前端需要妥善保管这两个值。
预约相关接口
预约信息上传
- 接口描述:
填写预约表单
-
请求方式:
POST
-
接口地址:/posts/release
-
请求参数
| 参数名称 | 参数类型 | 是否必须 | 备注 |
| ----------- | --------- | -------- | ----------------------------------- |
| serviceType | int | 是 | 服务类型 |
| userName | String | 是 | 申请者姓名 |
| className | String | 是 | 专业班级 |
| place | String | 是 | 地点 |
| timestamp | timestamp | 是 | 预约时间,格式为yyyy-MM-dd HH:mm:ss |
| phone | String | 是 | 联系手机 |
| studentId | String | 是 | 学生id |
| details | String | 是 | 详细信息 |
| imageIds | String | 是 | 图片,为image的id集合 | -
时间格式:yyyy-MM-dd HH:mm:ss
-
请求示例:
- 参数格式:application/json
{
"serviceType": 1,
"userName": "QC",
"className": "软件工程222",
"place": "劲竹327",
"timestamp": "2023-05-10 14:17:29",
"phone": "18357789776",
"studentId": "1220204124",
"details": "测试测试测试",
"imageIds": [
"1653429808434016257",
"1653576591235710978"
]
}
- 响应示例:
- 格式:application/json
{
"code": 200,
"msg": "发布成功",
"data": null
}
code
为200表示服务器正常响应,4xx客户端错误,5xx服务器错误msg
为提示词data
表示后端返回的数字,此时为null
表示发布后后端为传回数据
列举预约帖子
- 接口描述:
获取全部的预约帖子
对于用户,通过用户验证,查找是哪个用户,放回对于用户发布预约帖子的信息
对于管理员,则列举全部帖子
-
请求方式:GET
-
接口地址:/posts/list
-
请求参数:无
-
响应示例:
- 参数格式:application/json
{
"code": 200,
"msg": "success",
"data": [
{
"id": "1653602310892306433",
"author": "1651586727296425986",
"serviceType": 1,
"userName": "QC",
"className": "软件工程222",
"place": "劲竹327",
"timestamp": "1970-01-20 19:31:24.0",
"phone": "18357789776",
"studentId": "1220204124",
"details": "测试测试测试",
"status": 0,
"msg": null,
"createTime": "2023-05-03 11:28:08.0",
"imageIds": [
"1653429808434016257",
"1653576591235710978"
]
},
{
"id": "1653602561728462850",
"author": "1651586727296425986",
"serviceType": 1,
"userName": "QC",
"className": "软件工程222",
"place": "劲竹327",
"timestamp": "1970-01-20 19:31:24.0",
"phone": "18357789776",
"studentId": "1220204124",
"details": "测试测试测试",
"status": 0,
"msg": "",
"createTime": "2023-05-03 11:29:07.0",
"imageIds": [
"1653429808434016257",
"1653576591235710978"
]
}
]
}
- 响应失败示例:表示未登录
{
"code": 500,
"msg": "NOT_LOGIN"
}
分页查询帖子
- 接口描述:
分页查询帖子,可传入关键词进行筛选
对于用户,通过用户验证,查找是哪个用户,放回对于用户发布预约帖子的信息
对于管理员,则列举全部帖子
-
请求方式:GET
-
接口地址:/posts
-
请求参数:
- 格式:queryString
| 参数名 | 类型 | 是否必须 | 备注 |
| ------ | ------ | -------- | -------------------- |
| page | String | 是 | 当前页数 |
| size | String | 是 | 每页大小(几个对象) |
| search | String | 否 | 关键字 |
- 格式:queryString
-
请求示例:/posts/page?page=2&size=4
-
请求示例:/posts/page?page=2&size=4&search=劲竹
-
响应示例:
- 参数格式:application/json
{
"code": 200,
"msg": "success",
"data": {
"total": "2",
"records": [
{
"id": "1653602561728462850",
"author": "1651586727296425986",
"serviceType": 1,
"userName": "QC",
"className": "软件工程222",
"place": "劲竹327",
"timestamp": "1970-01-20 19:31:24.0",
"phone": "18357789776",
"studentId": "1220204124",
"details": "测试测试测试",
"status": 0,
"msg": "123123123",
"createTime": "2023-05-03 11:29:07.0",
"imageIds": [
"1653429808434016257",
"1653576591235710978"
]
},
{
"id": "1653602310892306433",
"author": "1651586727296425986",
"serviceType": 1,
"userName": "QC",
"className": "软件工程222",
"place": "劲竹327",
"timestamp": "1970-01-20 19:31:24.0",
"phone": "18357789776",
"studentId": "1220204124",
"details": "测试测试测试",
"status": 0,
"msg": null,
"createTime": "2023-05-03 11:28:08.0",
"imageIds": [
"1653429808434016257",
"1653576591235710978"
]
}
]
}
}
-
data中tatal表示的是当前返回的数据数量,records是列举出来的帖子
-
响应失败示例:表示未登录
{
"code": 500,
"msg": "NOT_LOGIN"
}
获取帖子总数
- 接口描述:
根据关键字查询匹配的帖子,返回数量
对于用户,通过用户验证,查找是哪个用户,放回对于用户发布预约帖子的信息
对于管理员,则列举全部帖子
-
请求方式:GET
-
接口地址:/posts/total
-
请求参数:
- 格式:queryString
| 参数名 | 类型 | 是否必须 | 备注 |
| ------ | ------ | -------- | ------ |
| search | String | 否 | 关键字 |
- 格式:queryString
-
请求示例:/posts/total?search=劲竹
-
响应示例:
- 参数格式:application/json
{
"code": 200,
"msg": "success",
"data": "12"
}
- data返回数量
上传下载
上传图片
- 接口描述:
上传文件
-
请求方式:POST
-
接口地址:/common/upload
-
请求参数:
- 格式:multipart/form-data
| 参数名称 | 参数类型 | 是否必须 | 备注 |
| -------- | -------- | -------- | -------- |
| imaage | file | 是 | 上传图片 |
- 格式:multipart/form-data
-
响应数据:
- 参数格式:application/json
{
"code": 200,
"msg": "文件上传成功",
"data": {
"id": "1653721858752167937",
"originalFilename": "红-日.webp",
"url": "/common/download/红-日.webp",
"uploadUser": "1653704050551590913",
"uploadTime": "2023-05-03 19:23:10"
}
}
{
"code": 200,
"msg": "重复的文件",
"data": {
"id": "1653721858752167937",
"originalFilename": "红-日.webp",
"url": "/common/download/红-日.webp",
"uploadUser": "1653704050551590913",
"uploadTime": "2023-05-03 19:23:10"
}
}
- msg为"文件上传成功"或"重复的文件"
- data中返回图片的相关信息,其中url可以作为图片的src进行回显,在表单上传时也需要这个链接地址。如果文件已经存在,则直接返回数据库中的信息。
文件下载1
- 接口描述:
根据文件名或者id查询图片链接
-
请求方式:GET
-
接口地址:common/download
-
请求参数:queryString
| 参数名 | 类型 | 是否必须 | 备注 |
| ------ | ------ | -------- | ------ |
| name | String | 二选一 | 文件名 |
| id | String | 二选一 | 文件id | -
请求示例1:/common/download?name=code.png
-
请求示例2:/common/download?id=1653757308967632897
-
响应数据:文件
文件下载2
- 接口描述:
根据文件名查询图片链接
-
请求方式:GET
-
接口地址:common/download/
-
请求参数:PathVariable
| 参数名 | 类型 | 是否必须 | 备注 |
| ------ | ------ | -------- | ------ |
| name | String | 是 | 文件名 | -
请求示例:/common/download/code.png
-
响应数据:文件
列举文件
- 接口描述:
获取所有的图片文件
-
请求方式:GET
-
接口地址:/common/list
-
请求参数:无
-
响应示例:
- 格式:application/json
{
"code": 200,
"msg": "success",
"data": [
{
"id": "2132762627",
"originalFilename": "123",
"url": "/common/download?id=2132762627",
"uploadTime": "2023-04-01 17:49:38",
"uploadUserName": "未知用户"
},
{
"id": "1653429808434016257",
"originalFilename": "QQ截图20230110192939.png",
"url": "/common/download?id=1653429808434016257",
"uploadTime": "2023-05-03 00:02:40",
"uploadUserName": "未知用户"
}
]
}
- 响应参数:
| 参数名 | 类型 | 是否必须 | 备注 |
| ---------------- | ------ | -------- | ------------ |
| id | String | 是 | 图片id |
| originalFilename | String | 是 | 文件名 |
| url | String | 是 | 图片下载地址 |
| uploadTime | String | 是 | 上传时间 |
| uploadUserName | String | 是 | 上传用户名 |
用户登录
获取sessionId
- 接口描述:
获取后端登录凭证
-
请求方式:GET
-
接口地址:/user/getSessionId
-
请求参数:
- 格式:queryString
| 参数名 | 类型 | 是否必须 | 备注 |
| ------ | ------ | -------- | ------ |
| code | String | 是 | 微信登录凭证 |
- 格式:queryString
-
请求示例:/user/getSessionId?code=abc123456789
-
响应示例:
- 格式:application/json
{
"code": 200,
"msg": "success",
"data": {
"sessionId": "1ed57a89-a550-409a-baf1-8b6ef1582600"
}
}
- 失败示例:
{
"code": 500,
"msg": "invalid appid",
"data": null
}
- 参数说明:sessionId为登录凭证
微信登录
- 接口描述:
上传加密的用户信息,后端进行解密验证登录
-
请求方式:POST
-
接口地址:/user/authLogin
-
请求参数:
| 参数名 | 类型 | 是否必须 | 备注 |
| ------------- | ------ | -------- | -------------- |
| encryptedData | String | 是 | 加密的用户信息 |
| iv | String | 是 | 加密初始向量 |
| sessionId | String | 是 | 后端登录凭证 | -
请求示例:
- 格式:application/json
{
"encryptedData": "2fvjouA8ykrvyhfIhPwsuE6JhA9UrAQrDJCl8pemYLFBmW7sQJtCGfTck5wy3ATTn1Ig5tt3c+YirtyAo0r+7omK/RM8si+cakQ6rrcfcgeOFvh5DPJFdtPiE4sdfbHLk2zL2G0AEL0wZuenr5edxlQIHiqEzAui0Wj4ml2W9BPkVxs3J0KbfDr8x7gkUgmQq5rNgZP4goMXTSzEguRbuOX09OGLryJKFGRhOEiUexcHWnMPgOyQYrI7d2pJxTHOHJwPI6vvsmjaxr9oUmZEDqnNhA7Z2oMRxW64u0onRKvZRxU8iR/SO7BHTyed0PHp4eUaDFt1ICmlCSSinH1KVDhOBqBhOsCbnW0wSixx0j4oe3npuEr4oL0mw5UgNQDJsRFYcUNZH4Bu798OLnxj+RuBqlSbI/UU9Bd7PwfnkTcJy2WczZnTuqxXvWgsTDfa",
"iv": "Ebefqfdxp03bW+lAoXBPPA==",
"sessionId": "1ed57a89-a550-409a-baf1-8b6ef1582600"
}
- 响应示例:
- 格式:application/json
{
"code": 200,
"msg": "success",
"data": {
"id": "1651172985932300290",
"nickName": "前程QCQCQC",
"city": "温州",
"province": "浙江",
"country": "中国",
"avatar": "http://web-myapp.oss-cn-beijing.aliyuncs.com/2023-04-20/%E5%A4%B4%E5%83%8F1681999217002.jpg",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2ODMxMTQ2NjB9.aIVO88dVCrkJcTFGbDFXWP5vNTu8MRZaLg3c-hNmM6g",
"status": 1
}
}
- 参数说明:
| 参数名 | 参数类型 | 是否必须 | 备注 |
| --------- | -------- | -------- | ----------- |
| code | String | 是 | 响应码 |
| msg | String | 是 | 消息 |
| data | Object | 是 | 数据 |
| -id | String | 是 | 用户标识 |
| -nickName | String | 是 | 用户名 |
| -city | String | 是 | 城市 |
| -province | String | 是 | 省份 |
| -country | String | 是 | 国家 |
| -avatar | String | 是 | 头像URL |
| -token | String | 是 | JWT身份凭证 |
| -status | int | 是 | 启用状态 |
通过手机号注册用户,发送短信验证码接口
- 接口描述:
提供openid与手机号,用于注册用户
-
请求方式:GET
-
接口地址:/user/sendSms
-
请求参数:
-
格式:queryString
| 参数名 | 类型 | 是否必须 | 备注 |
| ------------- | ------ | -------- | -------------- |
| phone | String | 是 | 手机号 |
| openId | String | 是 | 微信唯一id | -
请求示例:/user/sendSms?phone=18357789776&openId=testtesttesttest
-
响应成功:
{
"code": 200,
"msg": "success",
"data": {
"sessionId": "21533ea6-db3b-4c03-800e-11eb10836424"
}
}
- 响应失败:
{
"code": 500,
"msg": "验证码已发送,请勿重复发送",
"data": null
}
- 参数说明:sessionId为会话标识
注意:前端一定要妥善保管sessionId,在提交验证时会使用到,短信验证接口,对于每一个号码的发送间隔时限为1分钟,每一个验证码的有效期为5分钟。值得一提的是这里的openId是必须的,作为注册或者登录的用户唯一标识,前端可以通过wx.login来获取这个openId将其发送给后端。
通过手机号注册用户,验证短信验证码接口
- 接口描述:
校验验证码进行注册或登录
-
请求方式:POST
-
接口地址:/user/smsLogin
-
请求参数:
| 参数名 | 类型 | 是否必须 | 备注 |
| ------------- | ------ | -------- | -------------- |
| code | String | 是 | 验证码 |
| sessionId | String | 是 | 会话标识 | -
请求示例:
- 格式:application/json
{
"code": "278042",
"sessionId": "aca85665-cf8e-4c2a-b05d-33ecaf4934f8"
}
- 成功示例:
{
"code": 200,
"msg": "success",
"data": {
"id": "1651939555080683522",
"nickName": "18357789776",
"city": null,
"province": null,
"country": null,
"avatar": null,
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2ODMzNDc3MDN9.EfiiYDH8IVYOVFxIK-JGpj362MyTMJRGwNPW3rVZBCk",
"status": 0
}
}
- 失败案例
{
"code": 500,
"msg": "验证码已过期,请重新获取",
"data": null
}
- 参数说明:
| 参数名 | 参数类型 | 是否必须 | 备注 |
| --------- | -------- | -------- | ----------- |
| code | String | 是 | 响应码 |
| msg | String | 是 | 消息 |
| data | Object | 是 | 数据 |
| -id | String | 是 | 用户标识 |
| -nickName | String | 是 | 用户名 |
| -city | String | 是 | 城市 |
| -province | String | 是 | 省份 |
| -country | String | 是 | 国家 |
| -avatar | String | 是 | 头像URL |
| -token | String | 是 | JWT身份凭证 |
| -status | int | 是 | 启用状态 |
获取用户信息
- 接口描述:
用户自己获取个人信息
-
请求方式:GET
-
接口地址:/user/userinfo
-
请求参数:
- 格式:queryString
| 参数名 | 类型 | 是否必须 | 备注 |
| ------ | ------ | -------- | ------ |
| refresh | int | 是 | 是否刷新 |
- 格式:queryString
-
请求示例:/user/userinfo?refresh=0
-
响应示例:
- 参数格式:application/json
{
"code": 200,
"msg": "success",
"data": {
"id": "1653704050551590913",
"nickName": "微信用户",
"city": "",
"province": "",
"country": "",
"avatar": "https://thirdwx.qlogo.cn/mmopen/vi_32/POgEwh4mIHO4nibH0KlMECNjjGxQUq24ZEaGT4poC6icRiccVGKSyXwibcPq4BWmiaIGuG1icwxaQX6grC9VemZoJ8rg/132",
"phone": null,
"token": null,
"status": 1
}
}
- data参数解释:
| 参数名 | 类型 | 备注 |
| -------- | ------ | ---------------------------- |
| id | String | 用户id |
| nickName | String | 用户名 |
| city | String | 城市 |
| province | String | 省份 |
| country | String | 国家 |
| avatar | String | 头像,图片id |
| phone | String | 手机号注册的用户会有这个信息 |
| token | String|根据用户id重新生成的token |
| status | int|用户状态,1启用0禁用 |
更新用户信息
- 接口描述:
提交需要更改的用户信息,id为必须字段,其他可以没有
-
请求方式:PUT
-
接口地址:/user/userinfo
-
请求参数:
| 参数名 | 参数类型 | 是否必须 | 备注 |
| -------- | -------- | -------- | -------- |
| id | String | 是 | 用户标识 |
| nickName | String | 否 | 用户名 |
| city | String | 否 | 城市 |
| province | String | 否 | 省份 |
| country | String | 否 | 国家 |
| avatar | String | 否 | 头像地址 |
| gender | int | 否 | 性别 |
| status | int | 否 | 启用状态 | -
请求示例:
- 格式:application/json
{
"id": "1651172985932300290",
"nickName": "前程QCQCQC",
"city": "温州",
"province": "浙江",
"country": "中国",
"avatar": "http://web-myapp.oss-cn-beijing.aliyuncs.com/2023-04-20/%E5%A4%B4%E5%83%8F1681999217002.jpg",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2ODMxMTMzMzZ9.KdbgmoC5guQgpnQrwnxzbCRYXBWvva0EShGivH7m9U8",
"status": 1
}
- 响应成功示例:
{
"code": 200,
"msg": "success",
"data": {
"id": "1651172985932300290",
"nickName": "前程QCQCQC",
"gender": 0,
"city": "温州",
"province": "浙江",
"country": "中国",
"avatar": "http://web-myapp.oss-cn-beijing.aliyuncs.com/2023-04-20/%E5%A4%B4%E5%83%8F1681999217002.jpg",
"status": 1
}
}
- 失败示例:
{
"code": 500,
"msg": "更新失败",
"data": null
}
- 参数说明:
| 参数名 | 参数类型 | 是否必须 | 备注 |
| -------- | -------- | -------- | -------- |
| code | String | 是 | 响应码 |
| msg | String | 是 | 消息 |
| data | String | 是 | 数据 |
| id | String | 是 | 用户标识 |
| nickName | String | 否 | 用户名 |
| city | String | 否 | 城市 |
| province | String | 否 | 省份 |
| country | String | 否 | 国家 |
| avatar | String | 否 | 头像地址 |
| gender | int | 否 | 性别 |
| status | int | 否 | 启用状态 |
注意:这里的更新用户数据接口可以复用,比如开发禁用某个用户时,只需要将status设为0,后端会自动进行鉴权等操作,若status为0则返回用户已经禁用。
后台管理界面
后台管理员登录
- 接口描述:
-
请求方式:POST
-
接口地址:/employee/login
-
请求参数:
- 格式:application/json
-
请求示例:
{
"username": "admin",
"password": "adminadmin"
}
- 响应示例:
{
"code": 200,
"msg": "success",
"data": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2ODQzMzIyNjd9.B97MzlnvclotDCAskLPdpFXLVTpHhboMsm2Ab8ER1rM"
}
- 参数说明:
- data记录了jwt令牌,用来验证身份
查询系统信息
- 接口描述:
-
请求方式:
-
接口地址:
-
请求参数:
- 格式:
-
请求示例:
-
响应示例:
-
参数说明:
后台获取管理员信息
- 接口描述:
-
请求方式:GET
-
接口地址:/employee/userinfo
-
请求参数:无
-
响应示例:
{
"code": 200,
"msg": "success",
"data": {
"id": "1",
"username": "admin",
"avatar": "https://img.51miz.com/Element/00/88/60/42/3cb805be_E886042_a75650be.png",
"name": "Admin",
"password": "PASSWORD_NOT_DISPLAYED",
"phone": null,
"sex": null,
"status": 1,
"createTime": "2023-05-05 21:36:28",
"updateTime": "2023-05-05 21:36:28",
"createUser": "0",
"updateUser": "0"
}
}
- 失败示例:
{
"code": 500,
"msg": "Cannot invoke \"cn.bluecore.bookapp.pojo.Employee.setPassword(String)\" because \"currentEmployee\" is null",
"data": null
}
- 参数说明: