This commit is contained in:
chaosBreaking
2019-10-12 11:50:57 +08:00
parent 5601223085
commit 0bb94f6bc7
7 changed files with 261 additions and 7 deletions

View File

@@ -1,12 +1,13 @@
const User = require('./user.model'); const User = require('./user.model');
const Fund = require('../fund/fund.model'); const Fund = require('../fund/fund.model');
const VReq = require('../vreq/vreq.model');
const MsgCode = require('../msgCode/msgCode.controller'); const MsgCode = require('../msgCode/msgCode.controller');
const changePwd = require('../sign/sign.controller').changePasswd; const changePwd = require('../sign/sign.controller').changePasswd;
const Crypto = require('../../utils/crypto'); const Crypto = require('../../utils/crypto');
const { parseForm } = require('../../utils/form'); const { parseForm } = require('../../utils/form');
const { USER_FILE_DIR: userFileDir } = require('../../../configSec.js'); const { USER_FILE_DIR: userFileDir } = require('../../../configSec.js');
const { createAction } = require('../action/action.handler'); const { createAction } = require('../action/action.handler');
const { createTicket } = require('../ticket/ticket.handler'); const { createVerifyReq } = require('../vreq/vreq.handler');
const fs = require('fs'); const fs = require('fs');
if (!fs.existsSync(userFileDir)) { if (!fs.existsSync(userFileDir)) {
@@ -152,11 +153,35 @@ module.exports = {
data: list data: list
}); });
}, },
async getVerifyInfo (req, res) {
const { userId } = res.locals.user;
return await Promise.all([User.findById(userId), VReq.find({ userId })])
.then(([user, reqs]) => {
const verifyLevel = user.verifyLevel;
let verifyStatus = 'unknow';
for (let i = 0, len = reqs.length; i < len; ++i) {
if (reqs[i].verifyLevel === verifyLevel) {
verifyStatus = reqs[i].verifyStatus;
}
}
return res.json({
code: 0,
data: {
verified: +user.verifyLevel > 0,
verifyLevel: user.verifyLevel,
verifyData: user.verifyData[user.verifyLevel],
verifyStatus
}
});
});
},
async verify (req, res) { async verify (req, res) {
const { userId } = res.locals.user; const { userId } = res.locals.user;
const user = await User.findById(userId); const user = await User.findById(userId);
if (!user.verified) { if (!user.verifyLevel || user.verifyLevel < 0) {
// 未进行过认证 // 未进行过认证
// 一级认证
const verifyLevel = 1; const verifyLevel = 1;
const form = await parseForm(req, { const form = await parseForm(req, {
tag: userId, tag: userId,
@@ -173,17 +198,62 @@ module.exports = {
}); });
const action = createAction(5, { const action = createAction(5, {
userId, userId,
level: verifyLevel, detail: { verifyLevel, name, nation, idType, idNo, pic1: pic1.path, pic2: pic2.path }
detail: { name, nation, idType, idNo, pic1: pic1.path, pic2: pic2.path }
}); });
action.save(); const verifyReq = createVerifyReq({ userId, verifyLevel, name, nation, idType, idNo, pic1: pic1.path, pic2: pic2.path });
await Promise.all([
action.save(),
verifyReq.save(),
User.findByIdAndUpdate(userId, {
verifyData: {
[verifyLevel]: { name, nation, idType, idNo, pic1: pic1.path, pic2: pic2.path }
}
})
])
.catch(err => mylog.error(userId, '认证信息保存失败 ',err.msg));
return res.json({ return res.json({
code: 0, code: 0,
msg: '审核信息已提交' msg: '审核信息已提交'
}); });
} }
if (user.verified && +user.verifyLevel === 1) { else if (user.verified && +user.verifyLevel === 1) {
// 二级认证
const verifyLevel = 2;
const form = await parseForm(req, {
tag: userId,
uploadDir: userFileDir,
maxFileSize: 20 * 1024 * 1024, // 限制文件体积最大20m
keepExtensions: true,
encoding: 'utf-8'
});
const { pic } = form.data;
if (!pic) return res.json({
code: 1,
msg: '缺少必要信息'
});
const action = createAction(5, {
userId,
detail: { verifyLevel, pic: pic.path }
});
const verifyReq = createVerifyReq({ userId, verifyLevel, pic: pic.path });
await Promise.all([
action.save(),
verifyReq.save(),
User.findByIdAndUpdate(userId, {
verifyData: {
[verifyLevel]: { pic: pic.path }
}
})
])
.catch(err => mylog.error(userId, '认证信息保存失败 ',err.msg));
return res.json({
code: 0,
msg: '审核信息已提交'
});
} }
return res.json({
code: 404,
msg: '已经完成认证'
});
} }
}; };

View File

@@ -32,6 +32,14 @@ const UserSchema = new mongoose.Schema({
avatar: { avatar: {
type: String type: String
}, },
verifyLevel: {
type: Number,
default: 0
},
verifyData: {
type: {},
default: {}
},
option: { option: {
type: {} type: {}
}, },

View File

@@ -53,6 +53,11 @@ const services = [
method: 'POST', method: 'POST',
controller: controller.verify controller: controller.verify
}, },
{
url: '/verifyInfo',
method: 'GET',
controller: controller.getVerifyInfo
},
]; ];
module.exports = services.map(service => { module.exports = services.map(service => {

View File

@@ -0,0 +1,67 @@
'use strict';
const Vreq = require('./vreq.model');
const handleTicket = require('./vreq.handler');
module.exports = {
// 处理工单请求的api
async reqHandle (req, res) {
const { adminId } = res.locals.user;
if (!adminId) return res.json({ code: 1, msg: '非法访问' });
const { id } = req.body;
// 存在性检查
const ticket = await Vreq.findById(id).exec().catch(err => {
mylog.error(err);
return null;
});
if (!ticket) return res.json({
code: 1,
msg: 'unknow ticket'
});
// 调用处理函数
handleTicket(ticket, adminId).then(data => {
return res.json({
code: 0,
msg: 'success',
data: JSON.stringify(data)
});
}).catch(err => {
return res.json({
code: 1,
error: JSON.stringify(err)
});
});
},
async getReqList (req, res) {
const { adminId } = res.locals.user;
if (!adminId) return res.json({ code: 1, msg: '非法访问' });
const { pageSize = 0, pageIndex = 1} = req.query;
return Vreq.find({}).skip((+pageIndex - 1) * +pageSize).limit(+pageSize).then(data => {
return res.json({
code: 0,
data
});
}).catch(err => {
return res.json({
code: 1,
error: JSON.stringify(err)
});
});
},
async getReqDetail (req, res) {
const { adminId } = res.locals.user;
if (!adminId) return res.json({ code: 1, msg: '非法访问' });
const { ticketId } = req.query;
return Vreq.findById(ticketId).then(data => {
return res.json({
code: 0,
data
});
}).catch(err => {
return res.json({
code: 1,
error: JSON.stringify(err)
});
});
}
};

View File

@@ -0,0 +1,30 @@
'use strict';
const VReq = require('./vreq.model');
const User = require('../user/user.model');
function createVerifyReq (data) {
const { userId, verifyLevel, ...rest } = data;
return new VReq({
userId, verifyLevel, data: rest
});
}
async function handleReq (ticket, handlerId) {
// 所有工单在此处理只要状态未完结status !== 'finished',就可以多次调用改变状态。
ticket = await ticket.next(handlerId);
if (ticket.status === 'processing') {
await dealTicket(ticket);
await ticket.next(handlerId);
return ticket;
}
return null;
}
async function dealTicket (ticket, user) {
}
module.exports = {
createVerifyReq,
handleReq
};

View File

@@ -0,0 +1,47 @@
'use strict';
const mongoose = require('mongoose');
// 实名认证工单
const VreqSchema = new mongoose.Schema({
userId: {
type: String,
},
verifyLevel: {
type: Number,
default: 1
},
status: {
type: Number,
default: 0
},
data: {
type: {}
},
info: {
type: String,
default: '审核中'
},
option: {
type: {}
}
},{
timestamps: {}
});
const VreqModel = mongoose.model('Vreq', VreqSchema);
/**
* status: created -> processing -> finished
*/
VreqModel.prototype.next = async function (handler = '') {
// handler 表示处理人
if (+this.status === 1) return this;
if (this.status === 0) {
await this.update({
status: 'processing',
handler
});
}
return this;
};
module.exports = VreqModel;

View File

@@ -0,0 +1,27 @@
'use strict';
const indexRoute = '/vreq';
const controller = require('./vreq.controller');
const services = [
{
url: '/handle',
method: 'POST',
controller: controller.reqHandle
},
{
url: '/list',
method: 'GET',
controller: controller.getReqList
},
{
url: '/detail',
method: 'GET',
controller: controller.getReqDetail
},
];
module.exports = services.map(service => {
// 可以在此处对要导出的服务map进行统一处理
service.url = indexRoute + service.url;
return service;
});