models/user.js
var mongoose = require('mongoose');
var BaseModel = require("./base_model");
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var utility = require('utility');
var UserSchema = new Schema({
name: {type: String},
loginname: {type: String},
pass: {type: String},
email: {type: String},
url: {type: String},
profile_image_url: {type: String},
location: {type: String},
signature: {type: String},
profile: {type: String},
weibo: {type: String},
avatar: {type: String},
gender: {type: String, default: 'male', enum: ['male', 'female', 'genderless', 'bigender']}, // 男性,女性,无性别,双性别
// github
githubId: {type: String},
githubUsername: {type: String},
githubAccessToken: {type: String},
is_block: {type: Boolean, default: false},
score: {type: Number, default: 0},
topic_count: {type: Number, default: 0},
image_count: {type: Number, default: 0},
board_count: {type: Number, default: 0},
reply_count: {type: Number, default: 0},
follower_count: {type: Number, default: 0},
following_count: {type: Number, default: 0},
collect_tag_count: {type: Number, default: 0},
collect_topic_count: {type: Number, default: 0},
collect_board_count: {type: Number, default: 0},
like_image_count: {type: Number, default: 0},
get_image_count: {type: Number, default: 0},
create_at: {type: Date, default: Date.now},
update_at: {type: Date, default: Date.now},
is_star: {type: Boolean},
level: {type: String},
active: {type: Boolean, default: false},
receive_reply_mail: {type: Boolean, default: false},
receive_at_mail: {type: Boolean, default: false},
from_wp: {type: Boolean},
retrieve_time: {type: Number},
retrieve_key: {type: String},
accessToken: {type: String},
node: {type: ObjectId, ref: 'Node'},
is_two_factor: {type: Boolean, default: false},
two_factor_base32: {type: String}
});
UserSchema.plugin(BaseModel);
UserSchema.virtual('avatar_url').get(function () {
var url = this.avatar || ('https://gravatar.com/avatar/' + utility.md5(this.email.toLowerCase()) + '?size=48');
// www.gravatar.com 被墙
url = url.replace('www.gravatar.com', 'gravatar.com');
// 让协议自适应 protocol,使用 `//` 开头
if (url.indexOf('http:') === 0) {
url = url.slice(5);
}
// 如果是 github 的头像,则限制大小
if (url.indexOf('githubusercontent') !== -1) {
url += '&s=120';
}
return url;
});
UserSchema.virtual('isAdvanced').get(function () {
// 积分高于 700 则认为是高级用户
return this.score > 700 || this.is_star;
});
UserSchema.index({loginname: 1}, {unique: true});
UserSchema.index({email: 1}, {unique: true});
UserSchema.index({score: -1});
UserSchema.index({githubId: 1});
UserSchema.index({accessToken: 1});
UserSchema.pre('save', function (next) {
var now = new Date();
this.update_at = now;
next();
});
mongoose.model('User', UserSchema);