# zhihu-node **Repository Path**: wblues/zhihu-node ## Basic Information - **Project Name**: zhihu-node - **Description**: koa2+mongoose实现的仿知乎后台 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-05-09 - **Last Updated**: 2022-05-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 概述 本项目是仿照知乎的后台api接口,使用node.js,koa2框架+mongoose实现。主要包括有用户、话题、问题、回答、评论和首页等六个模块。 # 数据模型 ### 用户user 用户注册时只填写用户名和密码,其余的个人基本信息可以在后续通过更新用户资料完善。 | 名称 | 类型 | 是否必须 | 是否默认返回 | 默认值 | 备注 | | ----------- | ------ | -------- | -------------- | ------ | ------ | | name | string | 是 | 是 | | 用户名 | | password | string | 是 | 否 | | 密码 | | avatar | string | 否 | 是 | | 头像url | | gender | string | 否 | 否 | male | male-男性, female-女性 | | headline | string | 否 | 否 | | 一句话简介 | | locations | array | 否 | 否 | | 地址 | | business | string | 否 | 否 | | 工作(所在行业) | | employments | array | 否 | 否 | | 职业经历 | | educations | array | 否 | 否 | | 教育经历 | | following | array | 否 | 否 | | 关注列表 | | approvedAnswer | array | 否 | 否 | | 赞同回答列表 | | opposeAnswer | array | 否 | 否 | | 反对回答列表 | | collections | array | 否 | 否 | | 回答收藏列表 | ### 话题 Topic 每个问题都有对应的话题标签,根据话题标签可以对问题进行分类。 | 名称 | 类型 | 是否必须 | 是否默认返回 | 默认值 | 备注 | | ------------ | ------ | -------- | ------------ | ------ | -------- | | name | string | 是 | 是 | | 话题名 | | avatar_url | string | 否 | 是 | | 话题图片 | | introduction | string | 否 | 否 | | 话题介绍 | ### 问题 Question | 名称 | 类型 | 是否必须 | 是否默认返回 | 默认值 | 备注 | | ------------ | ------ | -------- | ------------ | ------ | -------- | | title | string | 是 | 是 | | 问题 | | description | string | 否 | 是 | | 详细描述 | | questioner | string | 是 | 否 | | 提问者 | | topics | array | 是 | 否 | | 关联的话题 | ### 回答 Answer | 名称 | 类型 | 是否必须 | 是否默认返回 | 默认值 | 备注 | | ------------ | ------ | -------- | ------------ | ------ | -------- | | author | ObjectId | 是 | 是 | | 回答者 | | content | string | 是 | 是 | | 回答内容 | | questionId | ObjectId | 是 | 是 | | 所属问题id | | approvedCount | number | 是 | 是 | | 赞同数 | | commentCount | number | 是 | 是 | | 评论数 | ### 评论 Comment 评论分为一级评论和二级评论 | 名称 | 类型 | 是否必须 | 是否默认返回 | 默认值 | 备注 | | ------------ | ------ | -------- | ------------ | ------ | -------- | | commentor | ObjectId | 是 | 是 | | 评论人 | | content | string | 是 | 是 | | 评论内容 | | questionId | string | 是 | 是 | | 所属问题id | | answerId | string | 是 | 是 | | 所属回答id | | rootComment | number | 是 | 是 | | 根评论 | | replyTo | ObjectId | 是 | 是 | | 回复对象 | | childrenReply | array | 是 | 是 | | 二级回复 | # 接口列表 ## 用户相关的接口 ### 注册 **请求地址**: /users **请求方式**: POST **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | name | string | 是 | | 用户名 | | | password | string | 是 | | 密码 | | ### 登陆 **请求地址**: /users/login **请求方式**: POST **请求头**: | 参数名称 | 参数值 | 是否必须 | 备注 | | ------------ | ---------------- | -------- | ----------------------------------------------------------- | | Content-Type | application/json | 是 | 如果用的axios, 默认data格式就是json的, 无需手动添加请求头了 | 请求参数(请求体-data): | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | name | string | 是 | | 用户名 | | | password | string | 是 | | 登录密码 | | **响应体格式**: | 名称 | 类型 | 备注 | 其他信息 | | --------- | ------ | --------- | -------------- | | message | string | 消息提示 | | | data | object | 响应数据 | | | \|--token | string | 用户token | 有效期为12小时 | ### 删除用户 **请求地址**: /users/:id **请求方式**: DELETE **请求头**: | 参数名称 | 参数值 | 是否必须 | 备注 | | ------------ | ---------------- | -------- | ----------------------------------------------------------- | | Content-Type | application/json | 是 | 如果用的axios, 默认data格式就是json的, 无需手动添加请求头了 | **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | id | string | 是 | | 用户id | | ### 修改用户 **请求地址**: /users/:id **请求方式**: PATCH **请求头**: | 参数名称 | 参数值 | 是否必须 | 备注 | | ------------ | ---------------- | -------- | ----------------------------------------------------------- | | Content-Type | application/json | 是 | 如果用的axios, 默认data格式就是json的, 无需手动添加请求头了 | **请求参数**: **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | name | string | 否 | | 用户名 | | | password | string | 否 | | 用户密码 | | | avatar | string | 否 | | 用户头像url | | | gender | string | 否 | | 性别 | | | headline | string | 否 | | 一句话简介 | | | locations | array | 否 | | 地址| | | business | string | 否 | | 工作 | | | employments | array | 否 | | 职业经历 | | | educations | array | 否 | | 教育经历 | | ### 用户关注列表 **请求地址**: /users/:id **请求方式**: GET **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | id | string | 是 | | 用户id | | ### 关注某一用户 **请求地址**: /users/following/:id **请求方式**: PUT **请求头**: | 参数名称 | 参数值 | 是否必须 | 备注 | | ------------ | ---------------- | -------- | ----------------------------------------------------------- | | Content-Type | application/json | 是 | 如果用的axios, 默认data格式就是json的, 无需手动添加请求头了 | **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | id | string | 是 | | 被关注用户id | | ### 取消关注用户 **请求地址**: /users/following/:id **请求方式**: DELETE **请求头**: | 参数名称 | 参数值 | 是否必须 | 备注 | | ------------ | ---------------- | -------- | ----------------------------------------------------------- | | Content-Type | application/json | 是 | 如果用的axios, 默认data格式就是json的, 无需手动添加请求头了 | **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | id | string | 是 | | 被取消关注用户id | | ### 获取关注列表 **请求地址**: /users/:id/listFollowers **请求方式**: GET **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | id | string | 是 | | 用户id | | ### 获取提问列表 **请求地址**: /users/:id/questions **请求方式**: GET **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | id | string | 是 | | 用户id | | ### 获取用户列表 **请求地址**: /users **请求方式**: GET **请求体参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | ---------------------- | ---------- | | perPage | string | 否 | 10 | 每次返回查询结果记录数 | | | page | string | 否 | 1 | 页码 | | | q | string | 否 | | 查询参数 | 查询用户名 | **响应格式** | 名称 | 类型 | 备注 | 其他信息 | | -------- | ------ | -------- | -------- | | message | string | 消息提示 | | | data | object | 响应数据 | | | \|--_id | string | 用户id | | | \|--name | string | 用户名 | | --- ### 获取特定用户信息 **请求地址**: /users/:id **请求方式**:GET **请求体参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | ---------------------- | ---------- | | id | string | 是 | | 用户id | | | fields | string | 否 | | 返回更多的字段 | 用分号 ; 间隔,例如: business;employments | **响应体格式**: 响应体格式: 同用户列表返回一致 ## 话题相关的接口 ### 话题列表 **请求地址**:/topic **请求方式**:GET **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | perPage | string | 否 | 10 | 每页结果数 | | | page | string | 否 | 1 | 页码 | | | q | string | 否 | | 查询参数 | | ### 查找特定话题 **请求地址**: /topic/:id **请求方式**:GET **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | id | string | 否 | | 话题id | | | fileds | string | 否 | | 返回额外的字段信息 | | | q | string | 否 | | 查询参数 | | ### 创建话题 **请求地址**: /topic **请求方式**:POST **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | name | string | 否 | | 话题名 | | | avatar_url | string | 否 | | 话题图片url | | | introduction | string | 否 | | 话题描述 | | ### 修改话题 **请求地址**: /topic/:id **请求方式**:PATCH **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | id | string | 否 | | 话题id | | | name | string | 否 | | 话题名 | | | avatar_url | string | 否 | | 话题图片url | | | introduction | string | 否 | | 话题描述 | | ### 获取话题下的问题 **请求地址**: /topic/:id/questions **请求方式**:GET **请求参数**: | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | -------- | -------- | | id | string | 否 | | 话题id | | ## 回答 ### 首页推荐回答 请求地址: ' /home/recommend ' 请求方式: GET | 参数名称 | 参数值 | 是否必须 | 备注 | | ------------ | ---------------- | -------- | ----------------------------------------------------------- | | Content-Type | application/json | 是 | 如果用的axios, 默认data格式就是json的, 无需手动添加请求头了 | 请求参数(请求体-data): | 名称 | 类型 | 是否必需 | 默认值 | 备注 | 其他信息 | | -------- | ------ | -------- | ------ | ---------------------- | -------- | | perPage | string | 否 | 10 | 每次返回查询结果记录数 | | | password | string | 否 | 1 | 页码 | | 响应体格式: | 名称 | 类型 | 备注 | 其他信息 | | ----------------- | ------ | ---------- | -------- | | message | string | 消息提示 | | | data | object | 响应数据 | | | \|--content | string | 回答内容 | | | \|--author | object | 回答者信息 | | | \|--questionId | object | 问题信息 | | | \|--commentCount | number | 评论数 | | | \|--approvedCount | number | 赞同数 | |