多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[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 } ~~~