# 毕设接口文档
**Repository Path**: quantaqd/design-interface-document
## Basic Information
- **Project Name**: 毕设接口文档
- **Description**: 毕设接口文档,方便前端使用接口
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2021-03-06
- **Last Updated**: 2023-03-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 接口文档
## 目录
1)登录
1.1)忘记密码,发送验证码邮件
1.2)忘记密码,更新密码
2)注册
2.1)注册时判断账号是否存在
3)查询城市
3.1)获取城市列表
3.2)省市二级联动 获取省份
3.3)省市二级联动 获取城市
4)个人中心
4.1)获取 我的发布 列表
4.2)修改 账号设置
4.3)上传 用户图片
4.4)更新 个人信息
4.5)获取 我的收藏 列表
4.6)获取 我的消息 列表
4.7)获取 用户数据
5)面经相关
5.1)发布面经
5.2)查询公司
5.3)获取 面经 列表(可添加关键词)(搜职位)
5.4)获取面经详情
5.5)评论面经,可多层嵌套
5.6)获取 公司 列表(无参数限制)
5.7)添加关键词,获取限制后的 公司列表(带参数限制)
5.8)获取特定公司 面经列表(搜公司)
5.9)删除面经评论(只有评论认证用户可以删除)
5.10)删除面经(只有发布面经的用户可以删除)
5.11)获取公司职位列表
5.12)根据公司职位 搜索该公司面经(具体某个公司)
6)题库相关
6.1)添加题库
6.2)获取 题库 列表
6.3)获取题库详情
6.4)往某个题库中添加题目
6.5)往某个题库中删除最后一条题目
7)收藏相关
7.1)添加收藏分类
7.2)返回分类列表(Array)
7.3)删除收藏分类
7.4)用户收藏面经、题库(点收藏按钮时提交)
7.5)删除收藏的面经、题库
7.6)判断用户是否收藏该面经/题库(判断收藏按钮样式)
7.7)面经页、题库取消收藏
**附录**
获取发布面经的具体时间
服务器错误统一返回
## 1. 登录
#### 请求url
{{baseURL}}/user/login
#### 请求方式
POST
#### 请求参数
body
手机号登录
```json
{
"phone": "……",
"password": "……"
}
```
邮箱登录
```json
{
"email": "……",
"password": "……"
}
```
#### 请求示例
```js
const data = {
phone: this.registerForm.phone,
password: this.registerForm.pass
};
axios.post('{{baseURL}}/user/login', data
).then(res => {
console.info(res.data);
});
```
#### 返回示例
**返回的用户信息需存储到全局状态中,在 发布面经 等模块使用!!
```json
{
"code": 200,
"data": {
"basicInfo": {
"nickname": "琪.林37",
"phone": "13245678903",
"password": "1f32aa4c9a1d2ea010adcf2348166a04"
},
"_id": "60423a1757d5735f402fc29d"
}
}
```
```json
{
"code": 0,
"message": "账号 or 密码 无效"
}
```
## 1.1 忘记密码,发送验证码邮件
#### 请求url
{{baseURL}}/user/passReset
#### 请求方式
POST
#### 请求参数
body
只能发送邮箱(验证时需用实际存在的邮箱,否则无法发送)
```json
{
"email": "……"
}
```
#### 返回示例
**返回的邮箱信息和验证码,供前端验证
```json
{
"code": 200,
"data": {
"email": "……",
"code": "5jnW"
}
}
```
## 1.2 忘记密码,更新密码
#### 请求url
{{baseURL}}/user/passForget
#### 请求方式
POST
#### 请求参数
body
```json
{
"email": "……",
"password": "……"
}
```
#### 返回示例
```json
{
"code": 200,
"data": "密码修改成功"
}
```
```json
{
"code": 0,
"message": "账号未注册过,请先完成注册"
}
```
## 2. 注册
#### 请求url
{{baseURL}}/user/register
#### 请求方式
POST
#### 请求参数
body
手机号注册
```json
{
"phone": "……",
"password": "……"
}
```
邮箱注册
```json
{
"email": "……",
"password": "……"
}
```
#### 请求示例
```js
const data = {
phone: this.registerForm.phone,
password: this.registerForm.pass
};
axios.post('{{baseURL}}/user/register', data
).then(res => {
console.info(res.data);
});
```
#### 返回示例
```json
{
"code": 200,
"data": "欢迎进入query系统!!"
}
```
```json
{
"code": 0,
"message": "Phone ……已存在"
}
```
```json
{
"code": 0,
"message": "Email ……已存在"
}
```
## 2.1 注册时判断账号是否存在
#### 请求url
{{baseURL}}/user/isRegister
#### 请求方式
GET
#### 请求参数
params(二选一)
| KEY | VALUE | DESCRIPTION |
| :---: | :---: | :---------: |
| phone | …… | 手机 注册 |
| email | …… | 邮箱 注册 |
```
?phone=……
?email=……
```
#### 返回示例
```json
{
"code": 200,
"data": "账号未注册过,可以使用!"
}
```
```json
{
"code": 0,
"message": "账号 …… 已存在!"
}
```
## 3. 查询城市
#### 请求url
{{baseURL}}/api/city
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :---: | :---: | :---------: |
| query | 台 | 查询关键词 |
```
?query=台
```
#### 请求示例
```js
axios.get('{{baseURL}}/api/city', {
params: {
query: "哈"
}
}).then(res => {
console.info(res.data);
});
```
#### 返回示例
有数据
```json
{
"code": 200,
"data": [
{
"city": "哈尔滨"
},
{
"city": "齐齐哈尔"
},
{
"city": "德令哈"
},
{
"city": "哈密"
}
]
}
```
无数据
```json
{
"code": 200,
"data": []
}
```
## 3.1 获取城市列表
#### 请求url
{{baseURL}}/api/cityList
#### 请求方式
GET
#### 请求参数
无
#### 返回示例
有数据
```json
{
"code": 200,
"data": [
{
"value": "北京"
},
{
"value": "天津"
},
{
"value": "上海"
},
{
"value": "重庆"
},
{
"value": "合肥"
},
{
"value": "宿州"
},
{
"value": "淮北"
}
]
}
```
无数据
```json
{
"code": 200,
"data": []
}
```
## 3.2 省市二级联动 获取省份
#### 请求url
{{baseURL}}/api/double/province
#### 请求方式
GET
#### 请求参数
无
#### 返回示例
有数据
```json
{
"code": 200,
"data": [
"北京市",
"天津市",
"上海市",
"重庆市",
"安徽省",
"福建省",
"甘肃省",
"广东省",
"贵州省",
"河北省",
"黑龙江省",
"河南省",
"湖北省",
"湖南省",
"吉林省",
"江西省",
"江苏省",
"辽宁省",
"山东省",
"陕西省",
"山西省",
"四川省",
"云南省",
"浙江省",
"青海省",
"海南省",
"广西壮族",
"内蒙古",
"宁夏回族",
"西藏",
"新疆维吾尔",
"香港",
"澳门",
"台湾省"
]
}
```
无数据
```json
{
"code": 200,
"data": []
}
```
## 3.3 省市二级联动 获取城市
#### 请求url
{{baseURL}}/api/double/city
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :------: | :----: | :---------: |
| province | 广东省 | 省份关键词 |
```
?province=广东省
```
#### 返回示例
有数据
```json
{
"code": 200,
"data": [
{
"city": "广州"
},
{
"city": "深圳"
},
{
"city": "清远"
},
{
"city": "韶关"
},
{
"city": "河源"
},
{
"city": "梅州"
},
{
"city": "潮州"
},
{
"city": "汕头"
},
{
"city": "揭阳"
},
{
"city": "汕尾"
},
{
"city": "惠州"
},
{
"city": "东莞"
},
{
"city": "珠海"
},
{
"city": "中山"
},
{
"city": "江门"
},
{
"city": "佛山"
},
{
"city": "肇庆"
},
{
"city": "云浮"
},
{
"city": "阳江"
},
{
"city": "茂名"
},
{
"city": "湛江"
},
{
"city": "从化"
},
{
"city": "增城"
},
{
"city": "英德"
},
{
"city": "连州"
},
{
"city": "乐昌"
},
{
"city": "南雄"
},
{
"city": "兴宁"
},
{
"city": "普宁"
},
{
"city": "陆丰"
},
{
"city": "恩平"
},
{
"city": "台山"
},
{
"city": "开平"
},
{
"city": "鹤山"
},
{
"city": "高要"
},
{
"city": "四会"
},
{
"city": "罗定"
},
{
"city": "阳春"
},
{
"city": "化州"
},
{
"city": "信宜"
},
{
"city": "高州"
},
{
"city": "吴川"
},
{
"city": "廉江"
},
{
"city": "雷州"
}
]
}
```
无数据
```json
{
"code": 200,
"data": []
}
```
## 4. 个人中心
## 4.1 获取 我的发布 列表
#### 请求url
{{baseURL}}/user/publishList/:id
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :--: | :----: | :------------------------: |
| / | 用户id | 查询对应用户发布的面经列表 |
```
/gw23gas12r2……
```
#### 返回示例
有数据(data数组,获取到个人发布的面经列表)
```json
{
"code": 200,
"data": [
"……"
]
}
```
无数据
```json
{
"code": 200,
"data": []
}
```
## 4.2 修改 账号设置
#### 请求url
{{baseURL}}/user/account/:id
#### 请求方式
POST
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :--: | :----: | :------------------: |
| / | 用户id | 获取对应用户账号信息 |
```
/gw23gas12r2……
```
body
修改昵称
```json
{
"nickname": "……"
}
```
修改邮箱
```json
{
"email": "……"
}
```
修改手机
```json
{
"phone": "……"
}
```
修改密码(新旧密码都需要传递)
```json
{
"prepass": "……",
"newpass": "……"
}
```
#### 请求示例
```js
axios.post('{{baseURL}}/user/upload/gw23gas12r2', {
nickname: "new nickname",
}).then(res => {
console.info(res.data);
});
```
#### 返回示例
修改成功
```json
{
"code": 200,
"data": "账号设置成功!!"
}
```
修改报错
传入的用户id找不到对应用户
```json
{
"code": 0,
"message": "未查询到当前用户信息"
}
```
```json
{
"code": 0,
"message": "该手机号已认证"
}
```
```json
{
"code": 0,
"message": "该邮箱已绑定"
}
```
```json
{
"code": 0,
"message": "原有密码输入错误!!"
}
```
## 4.3 上传 用户图片
#### 请求url
{{baseURL}}/user/upload/:id
#### 请求方式
POST
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :--: | :----: | :------------------: |
| / | 用户id | 获取对应用户账号信息 |
```
/gw23gas12r2……
```
body
修改头像
```json
{
"avatar": "……"
}
```
#### 请求示例
```js
axios.post('{{baseURL}}/user/upload/gw23gas12r2', {
avatar: this.imageUrl,
}).then(res => {
console.info(res.data);
});
```
#### 返回示例
修改成功
```json
{
"code": 200,
"data": "头像上传成功!!"
}
```
修改报错
传入的用户id找不到对应用户
```json
{
"code": 0,
"message": "未查询到当前用户信息"
}
```
## 4.4 更新 个人信息
#### 请求url
{{baseURL}}/user/personal/:id
#### 请求方式
POST
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :--: | :----: | :------------------: |
| / | 用户id | 获取对应用户账号信息 |
```
/gw23gas12r2……
```
body
```json
{
"educationInfo": {
"experience": [{
"during": [
"Sat Mar 27 2021 00:00:00 GMT+0800 (中国标准时间)",
"Thu Apr 08 2021 00:00:00 GMT+0800 (中国标准时间)"
],
"school": "广东外语外贸大学"
}],
"qualification": "大学本科"
},
"workInfo": [{
"firm": "阿里巴巴",
"position": "前端工程师",
"workYear": "3年"
}, {
"firm": "字节跳动",
"position": "产品经理",
"workYear": "2年"
}]
}
```
#### 返回示例
修改成功
```json
{
"code": 200,
"data": "个人信息更新成功!"
}
```
修改报错
传入的用户id找不到对应用户
```json
{
"code": 0,
"message": "未查询到当前用户信息"
}
```
## 4.5 获取 我的收藏 列表
#### 请求url
{{baseURL}}/user/collection
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :----: | :------------------: | :-----------------: |
| type | articles / questions | 获取收藏的面经/题库 |
| userId | …… | 获取当前用户id |
```
?userId=60423a1757d5735f402fc29d&type=articles
```
#### 返回示例
有数据(data数组,获取到个人发布的收藏列表)
```json
{
"code": 200,
"data": [
{
"category": "前端",
"storage": [ "……" ],
"_id": "6053a925714c8497309e77ca"
},
{
"category": "前端1",
"storage": [ "……" ],
"_id": "6054739ead8c49874040d4ed"
}
]
}
```
无数据
```json
{
"code": 200,
"data": []
}
```
## 4.6 获取 我的消息 列表
#### 请求url
{{baseURL}}/user/message/:id
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :--: | :----: | :------------------------: |
| / | 用户id | 查询对应用户发布的面经列表 |
```
/gw23gas12r2……
```
#### 返回示例
有数据(data数组,获取到个人发布的消息列表)
```json
{
"code": 200,
"data": [
"……"
]
}
```
无数据
```json
{
"code": 200,
"data": []
}
```
## 4.7 获取 用户数据
#### 请求url
{{baseURL}}/user/info
#### 请求方式
POST
#### 请求参数
body(根据用户id获取数据)
```json
{
"userId": "……"
}
```
#### 返回示例
修改成功
```json
{
"code": 200,
"data": {
"basicInfo": {
"nickname": "煜城76",
"phone": "……",
"password": "……"
},
"educationInfo": {
"experience": []
},
"workInfo": [],
"_id": "……"
}
}
```
修改报错
传入的用户id找不到对应用户
```json
{
"code": 0,
"message": "未查询到当前用户信息"
}
```
## 5. 面经相关
## 5.1 发布面经
#### 请求url
{{baseURL}}/article/new
#### 请求方式
POST
#### 请求参数
body
```json
{
"isAnonymous": true,
"background": {
"major": "信息管理与信息系统",
"other": "曾获挑战杯国家级一等奖",
"qualification": "大学本科",
"school": "广东外语外贸大学",
"workInfo": [{
"workYear": "3年",
"previousFirm": "阿里巴巴",
"previousPost": "产品运营"
}, {
"workYear": "1年",
"previousFirm": "字节跳动",
"previousPost": "产品经理"
}]
},
"baseInfo": {
"city": "北京",
"firm": "百度",
"position": "Web前端工程师"
},
"feedback": {
"difficulty": "较难",
"feeling": "很愉快",
"result": "通过"
},
"interview": {
"detail": [{
"interviewTime": "2h",
"interviewType": "技术面",
"processDesc": "1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面….\n1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面….",
"questionList": [
{
"answer": "Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作",
"question": "1. split() join() 的区别是什么?"
}
],
"tips": " 1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面….\n1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面….\n1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面….\n1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面…."
}, {
"interviewTime": "1h",
"interviewType": "群面",
"processDesc": "1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面….\n1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面….",
"questionList": [
{
"answer": "Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作",
"question": "1. split() join() 的区别是什么?"
}
],
"tips": " 1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面….\n1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面….\n1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面….\n1. 早上9点面的群面,中午回去睡觉休息,谁知道,下午1点就收到通知,2点半马上去进行一面…."
}],
"interviewConsole": " 分享面试经验,成为更好的自己!\n分享面试经验,成为更好的自己!\n分享面试经验,成为更好的自己!\n分享面试经验,成为更好的自己!\n分享面试经验,成为更好的自己!",
"interviewCounter": 1,
"interviewPrepare": " 在实习前的一个月左右,看了一些有关产品的书籍,比如结网和人人都是产品经理。除此之外,平常就多看看有关产品的信息,多留意身边最近比较火的app。在实习前的一个月左右,看了一些有关产品的书籍,比如结网和人人都是产品经理。除此之外,平常就多看看有关产品的信息,多留意身边最近比较火的app。",
"interviewResume": " 1、简历方面,大家可以多搜搜网上有关的模版,然后参照自己的经历来写。建议是简历不要太复杂,越简单越好,当然,这个很考虑自己对内容的提炼能力。2、简历中要多体现自己的项目经历,要有关产品的,不要说你去面试产品,然后写一堆技术方面的东西或是营销方面的东西。"
},
"positionInfo": {
"postDesc": " 请补充个人能力说明,以及相关背景介绍岗位在北京、上海、深圳、杭州四地均有招聘。1、负责抖音、抖音火山版、直播等产品C端前端研发,包括Webapp、ReactNative、Hybrid、运营活动等;2、负责抖音、抖音火山版、直播等产品PC端前端研发,包括MIS后台、开放平台等;3、探索新型高效前端开发模式;4、创造出极致的用户体验。",
"postRequire": " 1、计算机基础扎实,熟练掌握Javascript、CSS,熟练掌握各种布局;2、熟悉一种MVX(React/Vue/Angular)框架;3、熟悉一种构建工具(Webpack/FIS);4、有良好的系统模块设计能力;5、了解后端技术栈,熟悉一门后端语言(Node/Python/GO等),熟悉与后端的协作模式;6、有跨端开发经验(React Native/Weex/Flutter)优先;7、对大型网站架构有丰富经验者优先,有成功作品者优先。"
},
"title": "如何拿到百度offer",
"userId": "……"
}
```
#### 返回示例
```json
{
"code": 200,
"data": {
"articleId": "……"
}
}
```
## 5.2 查询公司
#### 请求url
https://www.kanzhun.com/search/autoComplete.json
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :---: | :------: | :------------: |
| query | 字节跳动 | 查询公司关键词 |
```
?query=字节跳动
```
#### 返回示例
有数据
```json
{
"resmsg": "成功",
"rescode": 1,
"resdata": {
"company": {
"id": 6844345,
"name": "北京字节跳动科技有限公司",
"logo": "https://img.kanzhun.com/images/gen_log/20201214/9587f42a459017b73b78fc2ed3977131.png",
"cityName": "北京",
"industryName": "移动互联网",
"financing": "",
"scaleDes": "1000-9999人",
"baseInfo": "北京-移动互联网-1000-9999人",
"interviewCount": "40",
"salaryCount": "3.1w",
"jobCount": "0",
"shortReviewCount": "0",
"allUgcCount": "3.1w",
"match": null,
"encId": "0Xx-3965FQ~~"
},
"auto": [
{
"id": 6844345,
"name": "北京字节跳动科技有限公司",
"hightName": "北京字节跳动科技有限公司",
"type": 9,
"typeValue": "公司",
"clearName": "北京字节跳动科技有限公司"
},
{
"id": 5622411,
"name": "字节跳动",
"hightName": "字节跳动",
"type": 9,
"typeValue": "公司",
"clearName": "字节跳动"
},
{
"id": 6386509,
"name": "今日头条 杭州",
"hightName": "今日头条 杭州",
"type": 9,
"typeValue": "公司",
"clearName": "今日头条 杭州"
},
{
"id": 6374413,
"name": "今日头条河南",
"hightName": "今日头条河南",
"type": 9,
"typeValue": "公司",
"clearName": "今日头条河南"
},
{
"id": 6848125,
"name": "今日头条青岛",
"hightName": "今日头条青岛",
"type": 9,
"typeValue": "公司",
"clearName": "今日头条青岛"
}
]
}
}
```
无数据
```json
{
"resmsg": "成功",
"rescode": 1,
"resdata": {
"company": null,
"auto": []
}
}
```
## 5.3 获取 面经 列表(可添加关键词)(搜职位)
#### 请求url
{{baseURL}}/article/list
#### 请求方式
GET
#### 请求参数
params(可不传)
time的value值为 天数,需要传递整数
| KEY | VALUE | DESCRIPTION |
| :------: | :------: | :--------------------: |
| city | 城市 | 搜索city关键词 |
| position | 职位 | 搜索position关键词 |
| time | 对应数字 | 筛选时间段对应面经数据 |
| | **KEY** | **VALUE** |
| | 全部 | 0 |
| | 最近一天 | 1 |
| | 最近一周 | 7 |
| | 最近一月 | 28/29/30/31 |
| | 最近一年 | 365/366 |
| | 两年内 | 730... |
```
?city=北京&position=web前端工程师&time=1
```
#### 返回示例
data数据,query对应搜索关键词,list为返回列表
```json
{
"code": 200,
"data": {
"query": {
"city": "北京",
"position": "web前端工程师",
"time": 1
},
"list": ["……"]
}
}
```
## 5.4 获取面经详情
#### 请求url
{{baseURL}}/article/detail/:id
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :--: | :----: | :----------------: |
| / | 面经id | 查询对应的面经信息 |
```
/gw23gas12r2……
```
#### 返回示例
data中存放面经详情数据
```json
{
"code": 200,
"data": {}
}
```
## 5.5 评论面经,可多层嵌套
#### 请求url
{{baseURL}}/article/comment
#### 请求方式
POST
#### 请求参数
body
**创建一级评论,直接评论面经
传入 `type` 字段为 `main`
```json
{
"type": "main",
"article": {
"id": "604f271a8e8f1e6f5496e8e7",
"title": "字节人er"
},
"content": "宣讲会最关心的问题就是字节offer什么时候到?!",
"userId": "6048f9064d5a8f5a8064e193",
"userInfo": {
"avatar": "https://s3.ax1x.com/2021/03/16/6sRVMQ.jpg",
"nickname": "子默51"
}
}
```
**创建二级评论,回复面经一级评论
传入 `type` 字段为 `sub`
```json
{
"type": "sub",
"comment": {
"id": "604cfae247fd5655f8d06d95",
"title": "宣讲会最关心的问题就是字节offer什么时候到?!"
},
"content": "春招投递,就有机会进字节哦",
"userId": "60430a0a24891415bc8e2b28",
"nickname": "炎彬_赖12"
}
```
**创建多级评论,回复面经二级以上的回复
传入 `type` 字段为 `multi`
```json
{
"type": "multi",
"comment": {
"id": "604cfd0a45667537b8e1a275",
"title": "春招投递,就有机会进字节哦"
},
"content": "求hr捞捞我",
"userId": "604487c04eb80e16b0b7c7c2",
"nickname": "思16"
}
```
#### 返回示例
```json
{
"code": 200,
"data": "评论面经成功!!"
}
```
## 5.6 获取 公司 列表(无参数限制)
#### 请求url
{{baseURL}}/article/companyList
#### 请求方式
GET
#### 请求参数
无
#### 返回示例
有数据
```json
{
"code": 200,
"data": [
{
"_id": "乐天地产(成都)有限公司",
"count": 1
}
]
}
```
无数据
```json
{
"code": 200,
"data": []
}
```
## 5.7 添加关键词,获取限制后的 公司列表(带参数限制)
#### 请求url
{{serverURL}}/article/company
#### 请求方式
GET
#### 请求参数
params(可不传)
time的value值为 天数,需要传递整数
| KEY | VALUE | DESCRIPTION |
| :--: | :------: | :--------------------: |
| city | 城市 | 搜索city关键词 |
| firm | 公司 | 搜索firm关键词 |
| time | 对应数字 | 筛选时间段对应面经数据 |
| | **KEY** | **VALUE** |
| | 全部 | 0 |
| | 最近一天 | 1 |
| | 最近一周 | 7 |
| | 最近一月 | 28/29/30/31 |
| | 最近一年 | 365/366 |
| | 两年内 | 730... |
```
?city=北京&firm=百度&time=1
```
#### 返回示例
data数据,query对应搜索关键词,list为返回列表
```json
{
"code": 200,
"data": {
"query": {
"firm": "百度"
},
"list": [
{
"_id": "百度",
"count": 11
}
]
}
}
```
```json
{
"code": 200,
"data": {
"query": {
"time": "1",
"firm": "法律"
},
"list": []
}
}
```
## 5.8 获取特定公司 面经列表(搜公司)
#### 请求url
{{serverURL}}/article/singleCompanyList
#### 请求方式
GET
#### 请求参数
| KEY | VALUE | DESCRIPTION |
| :--: | :---: | :------------: |
| firm | 公司 | 搜索firm关键词 |
```
?firm=百度
```
#### 返回示例
```json
{
"code": 200,
"data": ["……"]
}
```
## 5.9 删除面经评论(只有评论认证用户可以删除)
#### 请求url
{{baseURL}}/article/removeComment
#### 请求方式
POST
#### 请求参数
body
```json
{
"articleId": "……",
"commentId": "……"
}
```
#### 返回示例
```json
{
"code": 200,
"data": "删除评论成功"
}
```
```json
{
"code": 0,
"message": "未找到该评论"
}
```
## 5.10 删除面经(只有发布面经的用户可以删除)
#### 请求url
{{baseURL}}/article/delete/:id
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :--: | :----: | :----------------: |
| / | 面经id | 查询对应发布的面经 |
```
/gw23gas12r2……
```
#### 返回示例
```json
{
"code": 200,
"data": "删除面经成功"
}
```
```json
{
"code": 0,
"message": "未找到提交删除的此篇面经"
}
```
## 5.11 获取公司职位列表
#### 请求url
{{serverURL}}/article/position
#### 请求方式
GET
#### 请求参数
| KEY | VALUE | DESCRIPTION |
| :--: | :---: | :------------: |
| firm | 公司 | 搜索firm关键词 |
```
?firm=百度
```
#### 返回示例
```json
{
"code": 200,
"data": [
"Web前端工程师"
]
}
```
## 5.12 根据公司职位 搜索该公司面经(具体某个公司)
#### 请求url
{{serverURL}}/article/singleCompanySearch
#### 请求方式
GET
#### 请求参数
公司和职位不做模糊匹配,需要传完全匹配的公司和职位名称
| KEY | VALUE | DESCRIPTION |
| :------: | :---: | :----------------: |
| firm | 公司 | 搜索firm关键词 |
| position | 职位 | 搜索position关键词 |
```
?firm=百度&position=Web前端工程师
```
#### 返回示例
```json
{
"code": 200,
"data": [ "……" ]
}
```
## 6. 题库相关
## 6.1 添加题库
#### 请求url
{{baseURL}}/queBank/add
#### 请求方式
POST
#### 请求参数
body
```json
{
"description": "电子商务是指以信息网络技术为手段,以商品交换为中心的商务活动;也可理解为在互联网、企业内部网和增值网上以电子交易方式进行交易活动和相关服务的活动,是传统商业活动各环节的电子化、网络化、信息化",
"list": [
{
"question": "1、split() join() 的区别是什么?",
"answer": "Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作"
},
{
"question": "2、split() join() 的区别是什么?",
"answer": "Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作"
},
{
"question": "3、split() join() 的区别是什么?",
"answer": "Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作"
},
{
"question": "4、split() join() 的区别是什么?",
"answer": "Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作"
},
{
"question": "5、split() join() 的区别是什么?",
"answer": "Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作"
}
],
"tag": "电子商务1"
}
```
#### 返回示例
```json
{
"code": 200,
"data": "添加题库成功"
}
```
## 6.2 获取 题库 列表
#### 请求url
{{baseURL}}/queBank/list
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :--: | :---: | :-------------------------------------------: |
| base | 0或1 | 0表示获取面经问答题库
1表示获取自定义题库 |
```
?base=0
```
#### 返回示例
有数据(data数组,获取到题库列表)
0(Query问答题库,没有description字段)
```json
{
"code": 200,
"data": [
{
"tag": "Web前端工程师",
"_id": "605764709aadb46088892114"
}
]
}
```
1(自定义题库)
```json
{
"code": 200,
"data": [
{
"tag": "C++",
"_id": "60501da07fb23b3e680b6164",
"description": "C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。"
}
]
}
```
无数据
```json
{
"code": 200,
"data": []
}
```
## 6.3 获取题库详情
#### 请求url
{{baseURL}}/queBank/detail/:id
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :--: | :----: | :----------------: |
| / | 题库id | 查询对应的题库信息 |
```
/gw23gas12r2……
```
#### 返回示例
有数据(data数组,获取到题库详情)
```json
{
"code": 200,
"data": [
"……"
]
}
```
无数据
```json
{
"code": 200,
"data": []
}
```
## 6.4 往某个题库中添加题目
#### 请求url
{{baseURL}}/queBank/addList
#### 请求方式
POST
#### 请求参数
body
```json
{
"id": "6050415c90bea5781c23fbb1",
"list": [
{
"question": "1、split() join() 的区别是什么?",
"answer": "Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作"
},
{
"question": "2、split() join() 的区别是什么?",
"answer": "Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作"
},
{
"question": "3、split() join() 的区别是什么?",
"answer": "Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里即切割成数组的形式;join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作"
}
]
}
```
#### 返回示例
```json
{
"code": 200,
"data": "题库列表添加成功"
}
```
## 6.5 往某个题库中删除最后一条题目
#### 请求url
{{baseURL}}/queBank/removeList
#### 请求方式
POST
#### 请求参数
body
```json
{
"id": "6050415c90bea5781c23fbb1"
}
```
#### 返回示例
```json
{
"code": 200,
"data": "题库列表删除成功"
}
```
## 7. 收藏相关
## 7.1 添加收藏分类
#### 请求url
{{baseURL}}/collect/create
#### 请求方式
POST
#### 请求参数
body
userId 是判断为哪个用户添加的收藏分类
type 只能传入 articles / questions,对应 面经 / 题库
category 是分类名称
```json
{
"userId": "60423a1757d5735f402fc29d",
"type": "articles",
"category": "前端"
}
```
#### 返回示例
```json
{
"code": 200,
"data": "面经分类创建成功"
}
```
```json
{
"code": 0,
"message": "创建的分类已存在"
}
```
## 7.2 返回分类列表(Array)
#### 请求url
{{baseURL}}/collect/categoryList
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :----: | :------------------: | :---------------------: |
| type | articles / questions | 获取收藏的面经/题库分类 |
| userId | …… | 获取当前用户id |
```
?type=articles&userId=60423a1757d5735f402fc29d
```
#### 返回示例
```json
{
"code": 200,
"data": [
"前端",
"前端1",
"前端2"
]
}
```
## 7.3 删除收藏分类
#### 请求url
{{baseURL}}/collect/delete
#### 请求方式
POST
#### 请求参数
body
userId 是判断为哪个用户删除的收藏分类
type 只能传入 articles / questions,对应 面经 / 题库
category 是分类名称
```json
{
"userId": "60423a1757d5735f402fc29d",
"type": "articles",
"category": "前端"
}
```
#### 返回示例
```json
{
"code": 200,
"data": "面经分类删除成功"
}
```
```json
{
"code": 0,
"message": "传入参数有误,删除失败"
}
```
## 7.4 用户收藏面经、题库(点收藏按钮时提交)
#### 请求url
{{baseURL}}/collect/addCollection
#### 请求方式
POST
#### 请求参数
body
userId 是判断为哪个用户添加的收藏
type 只能传入 articles / questions,对应 面经 / 题库
category 是分类名称
collectId为收藏的面经 / 题库的id
```json
{
"userId": "60423a1757d5735f402fc29d",
"type": "questions",
"category": "前端",
"collectId": "6049badfefb78d74846c6236"
}
```
#### 返回示例
```json
{
"code": 200,
"data": "收藏成功"
}
```
## 7.5 删除收藏的面经、题库
#### 请求url
{{baseURL}}/collect/deleteCollection
#### 请求方式
POST
#### 请求参数
body
userId 是判断为哪个用户删除收藏
type 只能传入 articles / questions,对应 面经 / 题库
category 是分类名称
collectId为收藏的面经 / 题库的id
```json
{
"userId": "60423a1757d5735f402fc29d",
"type": "questions",
"category": "前端",
"collectId": "6049badfefb78d74846c6236"
}
```
#### 返回示例
```json
{
"code": 200,
"data": "删除成功"
}
```
## 7.6 判断用户是否收藏该面经/题库(判断收藏按钮样式)
#### 请求url
{{baseURL}}/collect/isCollect
#### 请求方式
GET
#### 请求参数
params
| KEY | VALUE | DESCRIPTION |
| :-------: | :------------------: | :---------------------: |
| type | articles / questions | 获取收藏的面经/题库分类 |
| userId | …… | 获取当前用户id |
| collectId | …… | 面经/题库id |
```
?userId=……&type=questions&collectId=……
```
#### 返回示例
该面经/题库收藏时,返回true;否则返回false
```json
{
"code": 200,
"data": true
}
```
## 7.7 面经页、题库取消收藏
#### 请求url
{{baseURL}}/collect/cancelCollection
#### 请求方式
POST
#### 请求参数
body
userId 是判断为哪个用户删除收藏
type 只能传入 articles / questions,对应 面经 / 题库
collectId为收藏的面经 / 题库的id
```json
{
"userId": "60423a1757d5735f402fc29d",
"type": "questions",
"collectId": "6049badfefb78d74846c6236"
}
```
#### 返回示例
```json
{
"code": 200,
"data": "取消收藏成功"
}
```
## 附录
#### 获取发布面经的具体时间
```js
// 获取 publishTime 字段(返回结果为 object 类型)
publishTime:
`2021-03-08T07:33:20.129+00:00`
publishTime.getFullYear()
publishTime.getMonth() + 1
publishTime.getDate()
publishTime.getHours()
publishTime.getMinutes()
publishTime.getSeconds()
```
#### 服务器错误统一返回
```json
{
"code": 500,
"message": "服务器错误!!"
}
```