86 lines
2.6 KiB
TypeScript
86 lines
2.6 KiB
TypeScript
import { COUNTER } from './../consts/consts';
|
|
import { CounterModel } from './Counter';
|
|
import BaseModel from './BaseModel';
|
|
import { index, getModelForClass, prop } from '@typegoose/typegoose';
|
|
const bcrypt = require('bcrypt');
|
|
const SALT_WORK_FACTOR = 5
|
|
|
|
|
|
/**
|
|
* 用户字段接口
|
|
*/
|
|
@index({ tel: 1 })
|
|
@index({ uid: 1 })
|
|
|
|
export default class GMUser extends BaseModel {
|
|
@prop({ required: true })
|
|
uid: number;
|
|
|
|
@prop({ required: true })
|
|
name: string;
|
|
|
|
@prop({ required: true })
|
|
username: string;
|
|
|
|
@prop({ required: true })
|
|
password: string;
|
|
|
|
@prop({ required: true })
|
|
salt: string;
|
|
|
|
@prop({ required: true })
|
|
token: string;
|
|
|
|
@prop({ required: true, default: '' })
|
|
group: string;
|
|
|
|
private static async encryptPass(password: string, salt?: string) {
|
|
console.log(salt)
|
|
if(!salt) {
|
|
salt = await bcrypt.genSalt(SALT_WORK_FACTOR);
|
|
}
|
|
console.log(salt)
|
|
let npassword = await bcrypt.hash(password, salt);
|
|
return {npassword, salt};
|
|
}
|
|
|
|
public static async getGmAccountByToken(token: string, lean = true) {
|
|
const user = await GMUserModel.findOne({token}).select('uid username name token group').lean(lean);
|
|
return user;
|
|
}
|
|
|
|
public static async getGmAccountByUid(uid: number, lean = true) {
|
|
const user = await GMUserModel.findOne({uid}).select('uid username name token group').lean(lean);
|
|
return user;
|
|
}
|
|
|
|
public static async getGmAccountByUsername(username: string, lean = true) {
|
|
const user = await GMUserModel.findOne({username}).select('uid username name token group').lean(lean);
|
|
return user;
|
|
}
|
|
|
|
public static async login(username: string, password: string, lean = true) {
|
|
const user = await GMUserModel.findOne({username}).select('salt').lean();
|
|
if(user) {
|
|
let { salt } = user;
|
|
console.log(salt)
|
|
let { npassword } = await this.encryptPass(password, salt);
|
|
console.log(username, npassword)
|
|
const checkUser = await GMUserModel.findOne({username, password: npassword}).select('uid username name token group').lean(lean);
|
|
return checkUser;
|
|
} else {
|
|
return null
|
|
}
|
|
}
|
|
|
|
public static async createGmAccount(username: string, password: string, name: string, token: string, group: string, lean = true) {
|
|
const uid = await CounterModel.getNewCounter(COUNTER.GMUID);
|
|
let r = await this.encryptPass(password);
|
|
const user = await GMUserModel.findOneAndUpdate({username}, {uid, password: r.npassword, salt: r.salt, name, token, group}, {upsert: true, new: true}).select('uid username name group').lean(lean);
|
|
return user;
|
|
}
|
|
|
|
}
|
|
|
|
export const GMUserModel = getModelForClass(GMUser);
|