# Article-API **Repository Path**: wessonc/article-api ## Basic Information - **Project Name**: Article-API - **Description**: 使用Node.js+Express编写的文章后端API接口项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-06-12 - **Last Updated**: 2023-06-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: Node, Nodejs, Express ## README ## Article-API_Server > 这是一个使用Node.js和Express编写的文章后台管理系统API接口项目。该项目使用了express-jwt来处理token验证,同时将路由和路由处理函数进行了模块化拆分。用户密码的加密处理使用了bcryptjs库,请求参数的验证则使用了joi库,大大简化了非空和格式判断的代码量。 [项目地址](https://gitee.com/wessonc/article-api/tree/main) ## Build Setup ```bash # 克隆项目 git clone https://gitee.com/wessonc/article-api.git # 进入项目目录 cd article-api # 安装依赖 npm install # 启动服务 npm run start ``` 浏览器访问 [http://127.0.0.1:3007](http://127.0.0.1:3007) ## 接口文档 ### /登录注册/用户注册 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/api/reguser #### 请求Body参数 | 参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 | | -------- | ------- | -------- | -------- | -------- | | username | ls | String | 是 | 用户名 | | password | 1234561 | String | 是 | 用户密码 | #### 认证方式 ```text noauth ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "注册成功!" } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "\"username\" is required" } ``` #### 返回参数说明: | 参数名 | 类型 | 说明 | | ------ | ------ | --------------------------------------- | | code | int | 请求是否成功,200:成功;400、409:失败 | | msg | string | 请求结果的描述消息 | 请求格式需为:**x-www-form-urlencoded** ## /登录注册/用户注册 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/api/reguser #### 请求方式 > POST #### 请求Body参数 | 参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 | | -------- | ------- | -------- | -------- | -------- | | username | ls | String | 是 | 用户名 | | password | 1234561 | String | 是 | 用户密码 | #### 认证方式 ```text noauth ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "注册成功!" } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "\"username\" is required" } ``` #### 返回参数说明: | 参数名 | 类型 | 说明 | | ------ | ------ | --------------------------------------- | | code | int | 请求是否成功,200:成功;400、409:失败 | | msg | string | 请求结果的描述消息 | 请求格式需为:**x-www-form-urlencoded** ## /个人中心/获取用户的基本信息 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/userinfo #### 请求方式 > GET #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "获取用户基本信息成功!", "data": { "id": 26, "username": "ls", "nickname": null, "email": null, "user_pic": null } } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "身份认证失败" } ``` #### 返回参数说明: | 参数名 | 类型 | 说明 | | ---------- | ------ | ---------------------------------- | | code | int | 请求是否成功,200:成功;400:失败 | | msg | string | 请求结果的描述消息 | | data | object | 用户的基本信息 | | + id | int | 用户 id | | + username | string | 用户名 | | + nickname | string | 用户昵称 | | + email | string | 用户邮箱 | | + user_pic | string | 用户头像,base64格式的图片 | **需携带token** ## /个人中心/更新用户的基本信息 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/userinfo #### 请求方式 > PUT #### 请求Body参数 | 参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 | | -------- | -------------------- | -------- | -------- | -------- | | id | 26 | Number | 是 | 用户id | | nickname | ls | String | 是 | 用户昵称 | | email | test_name&ls@163.com | String | 是 | 用户邮箱 | #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "操作成功" } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "\"email\" is required" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | ------ | ------ | --------------------------------------- | | code | int | 请求是否成功,200:成功;400、501:失败 | | msg | string | 请求结果的描述消息 | 请求格式需为:**x-www-form-urlencoded** 需携带**token** ## /个人中心/重置密码 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/updatepwd #### 请求方式 > POST #### 请求Body参数 | 参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 | | ------ | ------ | -------- | -------- | -------- | | oldPwd | 123456 | String | 是 | 原密码 | | newPwd | 000000 | String | 是 | 新密码 | #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "更新密码成功" } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "原密码错误!" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | ------ | ------ | ---------------------------------- | | code | int | 请求是否成功,200:成功;400:失败 | | msg | string | 请求结果的描述消息 | 请求格式需为:**x-www-form-urlencoded** 需携带**token** ## /个人中心/更换头像 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/update/avatar #### 请求方式 > PUT #### 请求Body参数 | 参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 | | ------ | ------------------------------------------ | -------- | -------- | -------------------------- | | avatar | data:image/png;base64,VE9PTUFOWVNFQ1JFVFM= | String | 是 | 新头像,base64格式的字符串 | #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "更新头像成功!" } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "\"avatar\" is not allowed to be empty" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | ------ | ------ | ---------------------------------- | | code | int | 请求是否成功,200:成功;400:失败 | | msg | string | 请求结果的描述消息 | 请求格式需为:**x-www-form-urlencoded** 需携带**token** ## /文章类别管理/获取文章分类列表 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/article/cates #### 请求方式 > GET #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "获取文章分类列表成功!", "data": [ { "id": 2, "name": "历史", "alias": "LiShi", "is_delete": 0 }, { "id": 3, "name": "科技", "alias": "food", "is_delete": 0 }, { "id": 4, "name": "测试", "alias": "test", "is_delete": 0 } ] } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "身份认证失败" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | ----------------- | -------- | ---------------------------------- | | code | int | 请求是否成功,200:成功;400:失败 | | msg | string | 请求结果的描述消息 | | data | array | 文章分类的数组 | | + Id | int | 分类 Id | | + name | string | 分类名称 | | + alias string | 分类别名 | | | + is_delete | int | 是否被删除,0:未删除;1:已删除 | 请求格式需为:**x-www-form-urlencoded** 需携带**token** ## /文章类别管理/新增文章分类 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/article/addcates #### 请求方式 > POST #### 请求Body参数 | 参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 | | ------ | ------ | -------- | -------- | -------- | | name | 科技 | String | 是 | 分类名称 | | alias | new | String | 是 | 分类别名 | #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "新增文章分类成功" } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "身份认证失败" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | ------ | ------ | --------------------------------------- | | code | int | 请求是否成功,200:成功;400、501:失败 | | msg | string | 请求结果的描述消息 | 请求格式需为:**x-www-form-urlencoded** 需携带**token** ## /文章类别管理/根据 Id 删除文章分类 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/article/deletecate/10 #### 请求方式 > DELETE #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "操作成功" } ``` #### 错误响应示例 ```javascript { "code": 501, "msg": "操作失败" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | ------ | ------ | ---------------------------------- | | code | int | 请求是否成功,200:成功;400:失败 | | msg | string | 请求结果的描述消息 | 需携带**token** ## /文章类别管理/根据 Id 获取文章分类数据 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/article/cates/5 #### 请求方式 > GET #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "获取文章分类成功", "data": { "id": 5, "name": "最新", "alias": "new", "is_delete": 0 } } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "获取文章分类数据失败" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | --------- | ------ | ---------------------------------- | | code | int | 请求是否成功,200:成功;400:失败 | | msg | string | 请求结果的描述消息 | | data | object | 文章分类的信息对象 | | Id | int | 分类 | | name | string | 分类名称 | | alias | string | 分类别名 | | is_delete | int | 是否被删除,0:未删除;1:删除 | 请求格式需为:**x-www-form-urlencoded** 需携带**token** ## /文章类别管理/根据 Id 更新文章分类数据 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/article/updatecate #### 请求方式 > PUT #### 请求Body参数 | 参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 | | ------ | ------ | -------- | -------- | -------- | | Id | 5 | Integer | 是 | 分类 Id | | name | 最新的 | String | 是 | 分类名称 | | alias | news | String | 是 | 分类别名 | #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "操作成功" } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "身份认证失败" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | ------ | ------ | ---------------------------------- | | code | int | 请求是否成功,200:成功;400:失败 | | msg | string | 请求结果的描述消息 | 请求格式需为:**x-www-form-urlencoded** 需携带**token** ## /文章管理/发布新文章 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/article/add #### 请求方式 > POST #### Content-Type > form-data #### 请求Body参数 | 参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 | | --------- | -------------------------------------- | -------- | -------- | ----------- | | title | 最新的测试test草稿 | String | 是 | 文章标题 | | cate_id | 5 | Integer | 是 | 所属分类 Id | | content | 最新的测试 | String | 是 | - | | cover_img | ["/Users/wesson/Pictures/扫描 2.jpeg"] | String | 是 | - | | state | 草稿 | String | 否 | - | #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "发布文章成功" } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "\"title\" is required" } ``` #### 发布新文章 返回参数说明 | 参数名 | 类型 | 说明 | | ------ | ------ | ---------------------------------- | | code | int | 请求是否成功,200:成功;400:失败 | | msg | string | 请求结果的描述消息 | 由于此接口涉及到文件上传的功能,因此提交的请求体,必须是**FormData**格式! 需携带**token** ## /文章管理/获取文章的列表数据 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/article/list?pagenum=1&pagesize=10&cate_id=&state=已发布 #### 请求方式 > GET #### 请求Query参数 | 参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 | | -------- | ------ | -------- | -------- | ---------------------------------- | | pagenum | 1 | Integer | 是 | 页码值 | | pagesize | 10 | Integer | 是 | 每页显示多少条数据 | | cate_id | - | String | 否 | 文章分类的 Id | | state | 已发布 | String | 否 | 文章的状态,可选值有:已发布、草稿 | #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "获取文章列表数据成功", "data": [ { "Id": 6, "title": "最新的测试test", "pub_date": "2023-06-16 01:26:55.054", "state": "草稿", "cate_name": "最新的" }, { "Id": 3, "title": "科学的尽头是玄学", "pub_date": "2023-06-15 20:45:03.917", "state": "已发布", "cate_name": "科学" }, { "Id": 2, "title": "abcdef", "pub_date": "2023-06-15 20:43:48.497", "state": "已发布", "cate_name": "历史" } ], "total": 3 } ``` #### 错误响应示例 ```javascript { "code": 500, "msg": "ER_SP_UNDECLARED_VAR: Undeclared variable: NaN" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | ----------- | ------ | ---------------------------------- | | code | int | 请求是否成功,200:成功;400:失败 | | msg | string | 请求结果的描述消息 | | data | array | 文章分类的数组 | | + Id | int | 文章 Id | | + title | string | 文章标题 | | + pub_date | string | 发布时间 | | + state | string | 状态 | | + cate_name | string | 所属分类名称 | 请求格式需为:**x-www-form-urlencoded** 需携带**token** ## /文章管理/根据 Id 删除文章数据 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/article/delete/2 #### 请求方式 > DELETE #### 认证方式 ```text bearer ``` #### 预执行脚本 ```javascript 暂无预执行脚本 ``` #### 后执行脚本 ```javascript 暂无后执行脚本 ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "删除成功" } ``` #### 错误响应示例 ```javascript { "code": 501, "msg": "删除失败,文章不存在" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | ------ | ------ | ---------------------------------- | | code | int | 请求是否成功,200:成功;501:失败 | | msg | string | 请求结果的描述消息 | 需携带**token** ## /文章管理/根据 Id 获取文章详情 #### 接口状态 > 已完成 #### 接口URL > http://127.0.0.1:3007/my/article/3 #### 请求方式 > GET #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "message": "获取文章成功!", "data": { "Id": 3, "title": "科学的尽头是玄学", "content": "adcdefg123", "cover_img": "/uploads/f7646e63605f5d6725fac0e7a3f2c370", "pub_date": "2023-06-15 20:45:03.917", "state": "已发布", "is_delete": 0, "cate_id": 1, "author_id": 3 } } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "找不到该文章" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | ----------- | ------ | ---------------------------------- | | code | int | 请求是否成功,200:成功;400:失败 | | msg | string | 请求结果的描述消息 | | data | object | 文章的详情 | | + Id | int | 文章 Id | | + title | string | 标题 | | + content | string | 内容 | | + cover_img | string | 封面的URL地址 | | + pub_date | string | 发表时间 | | + state | string | 状态 | | + is_delete | int | 是否被删除 | | + cate_id | int | 所属分类 Id | | + author_id | int | 所属作者 Id | 需携带**token** ## /文章管理/根据 Id 更新文章信息 #### 接口状态 > 需修改 #### 接口URL > http://127.0.0.1:3007/my/article/edit #### 请求方式 > PUT #### Content-Type > form-data #### 请求Body参数 | 参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 | | --------- | ------------------------------------ | -------- | -------- | ---------------------------------- | | Id | 1 | Integer | 是 | 分类 Id | | title | test New | String | 是 | 文章标题 | | cate_id | 4 | Integer | 是 | 文章分类的 Id | | content | 分类改为 测试 | String | 是 | 文章内容 | | cover_img | ["/Users/wesson/Pictures/扫描.jpeg"] | String | 是 | 文章封面 | | state | 草稿 | String | 是 | 文章的状态,可选值有:已发布、草稿 | #### 认证方式 ```text bearer ``` #### 成功响应示例 ```javascript { "code": 200, "msg": "更新文章成功" } ``` #### 错误响应示例 ```javascript { "code": 400, "msg": "\"Id\" is required" } ``` #### 返回参数说明 | 参数名 | 类型 | 说明 | | ------ | ------ | ---------------------------------- | | code | int | 请求是否成功,200:成功;501:失败 | | msg | string | 请求结果的描述消息 | 需携带**token**