From 0bb94f6bc7666a997246c49a886c60b4627e0e24 Mon Sep 17 00:00:00 2001 From: chaosBreaking Date: Sat, 12 Oct 2019 11:50:57 +0800 Subject: [PATCH] verify --- src/modules/user/user.controller.js | 84 ++++++++++++++++++++++++++--- src/modules/user/user.model.js | 8 +++ src/modules/user/user.service.js | 5 ++ src/modules/vreq/vreq.controller.js | 67 +++++++++++++++++++++++ src/modules/vreq/vreq.handler.js | 30 +++++++++++ src/modules/vreq/vreq.model.js | 47 ++++++++++++++++ src/modules/vreq/vreq.service.js | 27 ++++++++++ 7 files changed, 261 insertions(+), 7 deletions(-) create mode 100644 src/modules/vreq/vreq.controller.js create mode 100644 src/modules/vreq/vreq.handler.js create mode 100644 src/modules/vreq/vreq.model.js create mode 100644 src/modules/vreq/vreq.service.js diff --git a/src/modules/user/user.controller.js b/src/modules/user/user.controller.js index d4e435f..7fab642 100644 --- a/src/modules/user/user.controller.js +++ b/src/modules/user/user.controller.js @@ -1,12 +1,13 @@ const User = require('./user.model'); const Fund = require('../fund/fund.model'); +const VReq = require('../vreq/vreq.model'); const MsgCode = require('../msgCode/msgCode.controller'); const changePwd = require('../sign/sign.controller').changePasswd; const Crypto = require('../../utils/crypto'); const { parseForm } = require('../../utils/form'); const { USER_FILE_DIR: userFileDir } = require('../../../configSec.js'); const { createAction } = require('../action/action.handler'); -const { createTicket } = require('../ticket/ticket.handler'); +const { createVerifyReq } = require('../vreq/vreq.handler'); const fs = require('fs'); if (!fs.existsSync(userFileDir)) { @@ -152,11 +153,35 @@ module.exports = { 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) { const { userId } = res.locals.user; const user = await User.findById(userId); - if (!user.verified) { + if (!user.verifyLevel || user.verifyLevel < 0) { // 未进行过认证 + // 一级认证 const verifyLevel = 1; const form = await parseForm(req, { tag: userId, @@ -173,17 +198,62 @@ module.exports = { }); const action = createAction(5, { userId, - level: verifyLevel, - detail: { name, nation, idType, idNo, pic1: pic1.path, pic2: pic2.path } + detail: { verifyLevel, 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({ code: 0, 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: '已经完成认证' + }); } }; \ No newline at end of file diff --git a/src/modules/user/user.model.js b/src/modules/user/user.model.js index 7c4a38e..a014fb3 100644 --- a/src/modules/user/user.model.js +++ b/src/modules/user/user.model.js @@ -32,6 +32,14 @@ const UserSchema = new mongoose.Schema({ avatar: { type: String }, + verifyLevel: { + type: Number, + default: 0 + }, + verifyData: { + type: {}, + default: {} + }, option: { type: {} }, diff --git a/src/modules/user/user.service.js b/src/modules/user/user.service.js index 901f022..de4f8da 100644 --- a/src/modules/user/user.service.js +++ b/src/modules/user/user.service.js @@ -53,6 +53,11 @@ const services = [ method: 'POST', controller: controller.verify }, + { + url: '/verifyInfo', + method: 'GET', + controller: controller.getVerifyInfo + }, ]; module.exports = services.map(service => { diff --git a/src/modules/vreq/vreq.controller.js b/src/modules/vreq/vreq.controller.js new file mode 100644 index 0000000..298a2cb --- /dev/null +++ b/src/modules/vreq/vreq.controller.js @@ -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) + }); + }); + } +}; \ No newline at end of file diff --git a/src/modules/vreq/vreq.handler.js b/src/modules/vreq/vreq.handler.js new file mode 100644 index 0000000..6aaded7 --- /dev/null +++ b/src/modules/vreq/vreq.handler.js @@ -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 +}; \ No newline at end of file diff --git a/src/modules/vreq/vreq.model.js b/src/modules/vreq/vreq.model.js new file mode 100644 index 0000000..5d571b2 --- /dev/null +++ b/src/modules/vreq/vreq.model.js @@ -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; \ No newline at end of file diff --git a/src/modules/vreq/vreq.service.js b/src/modules/vreq/vreq.service.js new file mode 100644 index 0000000..ba3e40d --- /dev/null +++ b/src/modules/vreq/vreq.service.js @@ -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; +}); \ No newline at end of file