[TOC]
### 关注与粉丝 数据模型设计
~~~
// 引入 mongoose
const mongoose = require('mongoose')
const { Schema, model } = mongoose
// 创建用户Schema
const userSchema = new Schema({
__v: {
type: Number,
select: false
},
// 用户名
username: {
type: String,
required: true
},
// 登录密码
password: {
type: String,
required: true,
select: false
},
// 用户头像
avatar: {
type: String,
select: false
},
// 用户性别
gender: {
type: String,
required: true,
enum: ['male', 'female', 'secrecy'],
default: 'secrecy',
},
// 个人简介
introduce: {
type: String
},
// 居住地
residence: {
// 字符串数组
type: [{type: String}],
select: false
},
//行业
industry: {
type: String,
select: false
},
// 职业经历
career:{
type: [{
// 公司名称
corporate: {type: String},
// 职位
job: {type: String}
}],
select: false
},
// 教育经历
experience: {
type: [{
// 机构名称
title: {type: String},
// 专业方向
major: {type: String},
// 学历 enum: [1,2,3,4,5] 高中,本科,硕士,博士
education: { type: Number, enum: [1,2,3,4,5]},
// 入学年份
enrollment_year: { type: Number},
// 毕业年份
graduation_year: {type: Number}
}],
select: false
},
// 关注 与 粉丝
following: {
type: [{type:Schema.Types.ObjectId, ref: 'User'}],
select: false
}
})
// 生成用户模型
module.exports = model('User', userSchema)
~~~
*****
### 关注某人
~~~
// 关注某人
async follow(ctx) {
// 当前请求 id
const { id } = ctx.params
// token 中存放的 id
const { _id } = ctx.state.user
if (id === _id) { ctx.throw(400, '自己不能关注自己~!') }
const me = await User.findById(_id).select('+following')
if (!me.following.map(id => id.toString()).includes(id)) {
// 未关注
me.following.push(id)
me.save()
ctx.body = { code: 0, message: '关注成功' }
}
}
~~~
*****
### 获取当前登录用户的关注人列表
~~~
// 获取当前登录用户的关注人列表
async following(ctx) {
const me = await User.findById(ctx.params.id).select('+following').populate('following')
if (!me) { ctx.throw(400, '用户不存在!') }
ctx.body = me.following
}
~~~
*****
### 取消关注
~~~
// 取消关注
async unFollow(ctx) {
const user = await User.findById(ctx.state.user._id).select('+following')
if (!user) { ctx.throw(400, '用户不存在') }
const index = user.following.map(id => id.toString()).indexOf(ctx.params.id)
if (index > -1) {
user.following.splice(index, 1)
user.save()
ctx.body = { code:0, messages: '取消关注成功' }
}
}
~~~
*****
### 获取粉丝列表
~~~
// 获取粉丝列表
async fanList(ctx) {
// 查询所有用户 限定条件为 following 里面的id 等于当前请求的 id
const user = await User.find({following: ctx.params.id})
ctx.body = user
}
~~~
- 序言
- ES6模块化
- node基础
- FS模块
- 常用变量
- crypto加密
- 基础
- 安装
- 中间件
- 架构
- 结构分层
- 配置
- 路由
- 安装路由
- 自动加载
- 获取参数
- 路由前缀
- 路由中间件
- 控制器
- 请求
- 请求信息
- 数据库
- mongoDB
- mongoDB原生语句
- mongoDB数据库角色
- mongoose连接数据库
- 自动记录时间戳
- 模型
- mongoose模型
- 定义
- 模型初始化
- 查询
- 新增
- 更新
- 删除
- 隐藏字段
- 模式
- 关联查询
- 复杂模型
- 仿知乎个人资料建模
- 关注与粉丝
- 视图
- 模板
- edge
- 日志
- 错误和调试
- 调试当前文件
- nodemon调试
- 异常处理
- Koa2错误处理
- 验证
- Koa验证器
- async-validator
- installation
- 安全
- 数据加密
- 杂项
- jwt
- koa-jwt
- env环境变量配置
- 上传
- 分页和模糊搜索
- 扩展
- nodemon
- bodyparser
- koaJsonError
- cross-env
- uuid生成唯一ID
- pope字符串模板引擎
- 命令行
- 部署
- 附录
- RESTfulApi
- Http动词
- 状态码
- 调用频率限制
- 按需查询字段
- restful分页