const Card = require('../models/Card'); const Admin = require('../models/Admin'); const setJson = require('../until/SetJson'); const fs = require('fs'); const path = require('path'); const moment = require('moment'); const comparePasswordPromise = (card, password) => { return new Promise((resolve, reject) => { card.comparePassword(password, (err, data) => { if (err) { reject(err) } else { resolve(data) } }) }) }; const readFilePromise = (path) => { return new Promise((resolve, reject) => { fs.readFile(path, (err, data) => { if (err) { reject(err) } else { resolve(data) } }) }) }; const writeFilePromise = (file, data) => { return new Promise((resolve, reject) => { fs.writeFile(file, data, (err, data) => { if (err) { reject(err) } else { resolve(data) } }) }) }; const unlinkPromise = (path) => { return new Promise((resolve, reject) => { fs.unlink(path, (err, data) => { if (err) { reject(err) } else { resolve(data) } }) }) }; //用户登录 exports.login = async (req, res) => { let _card = req.body; let code = _card.code; let password = _card.password; try { let card = await Card.findOne({code}); //首先检查用户是否存在 if (!card) { console.log('用户名不存在'); res.json(setJson(false, '用户名不存在,请联系管理员', null)); } else { let isMatch = await comparePasswordPromise(card, password); //密码是否正确 if (isMatch) { console.log(`${code}(${card.cardholder}):登陆成功`); req.session.user = card; res.json(setJson(true, '登陆成功', card)); } else { res.json(setJson(false, '密码错误', null)); } } } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)); } }; //退出登录 exports.logout = (req, res) => { try { delete req.session.user; res.json(setJson(true, '退出登陆成功', null)); } catch (e) { res.json(setJson(false, e.message, null)); } }; //新增卡 exports.register = async (req, res) => { const _card = req.body; try { let card = await Card.find({code: _card.code}); if (card.length) { console.log('一卡通账号重复'); res.json(setJson(false, '一卡通账号重复,请刷新页面', null)); } _card.bills = [{time: Date.now(), place: '校园一卡通平台', amount: 80.00, type: '充值'}]; card = new Card(_card); await card.save(); res.json(setJson(true, '新增卡成功', null)); } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)); } }; //上传图片预处理 exports.beforeUpload = async (req, res) => { try { let photoData = req.files.photo; let originalFilename = photoData ? photoData.originalFilename : ''; if (originalFilename) { res.json(setJson(true, '服务端已准备好接收图片', photoData)); } else { res.json(setJson(false, '请选择需要上传的图片', null)); } } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)); } }; //上传图片 exports.upload = async (req, res, next) => { try { let isOldPhoto = ((typeof req.body.photo) === 'string'); //第一次上传头像且头像存在 if (!isOldPhoto && req.body.photo) { let photoData = req.body.photo.file.response.backData; let filePath = photoData ? photoData.path : ''; let originalFilename = photoData ? photoData.originalFilename : ''; //存在上传的文件则保存到服务器 if (originalFilename) { let data = await readFilePromise(filePath); let timestamp = Date.now(); let type = photoData.type.split('/')[1]; let photo = `${timestamp}.${type}`; let newPath = path.join(__dirname, '../../', '/server/public/upload/imgs/' + photo); await writeFilePromise(newPath, data); req.body.photo = photo; //删除原头像 let card = await Card.findOne({code: req.body.code}); if (card && card.photo) { let oldPath = path.join(__dirname, '../../', `/server/public/upload/imgs/${card.photo}`); await unlinkPromise(oldPath) } } } next() } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)); } }; //更新卡 exports.update = async (req, res) => { const _card = req.body; try { // let card = await Card.findOne({code: _card.code}); let card = await Card.findOneAndUpdate({code: _card.code}, _card, {new: true}); // card = await card.save(); res.json(setJson(true, '更新成功', card)); } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)); } }; //获取卡号 exports.getCode = async (req, res) => { try { let card = await Card.find(); let len = (parseInt((card[card.length - 1]).code, 10) + 1).toString(); let code = len.padStart(6, '0'); res.json(setJson(true, '获取卡号成功', code)); } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)); } }; //获取持卡人列表 exports.cardList = async (req, res) => { try { let cards = await Card.find({}) .sort({'meta.updateAt': -1}); res.json(setJson(true, '查询列表情成功', cards)) } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)) } }; //删除卡 exports.deleteCard = async (req, res) => { let _id = req.body._id; try { let card = await Card.findOneAndRemove({_id}); if (card.photo) { let oldPath = path.join(__dirname, '../../', `/server/public/upload/imgs/${card.photo}`); unlinkPromise(oldPath); } res.json(setJson(true, `删除持卡人${card.cardholder}成功`, null)) } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)) } }; //卡片信息详情 exports.detail = async (req, res) => { let code = req.query.code; try { let card = await Card.findOne({code}, 'code cardholder sex type isFrozen balance photo'); if (card) { res.json(setJson(true, '查看详情成功', card)) } else { res.json(setJson(false, 'not found,请确认一卡通账号是否正确', null)) } } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)) } }; //挂失操作 exports.frozen = async (req, res) => { let code = req.body.code; try { let card = await Card.findOne({code}); card.isFrozen = !card.isFrozen; card = await Card.findOneAndUpdate({code}, card, {new: true}); delete card.bills; let str = card.isFrozen ? '挂失' : '解挂'; res.json(setJson(true, `${str}成功`, card)) } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)) } }; //重置密码操作 exports.resetPassword = async (req, res) => { let code = req.body.code; try { let card = await Card.findOne({code}); card.password = '666666'; card = await card.save(); res.json(setJson(true, `重置成功`, card)) } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)) } }; //修改密码操作 exports.changePassword = async (req, res) => { let code = req.session.user.code; let oldPassword = req.body.oldPassword; let password = req.body.password; try { let card = await Card.findOne({code}); if (!card) { console.log('用户名不存在'); res.json(setJson(false, '登录状态异常,请重新登录系统', null)); } else { let isMatch = await comparePasswordPromise(card, oldPassword); //密码是否正确 if (isMatch) { card.password = password; card = await card.save(); res.json(setJson(true, `修改成功`, null)) } else { res.json(setJson(false, '修改失败,原密码错误', null)); } } } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)) } }; //充值操作 exports.recharge = async (req, res) => { let code = req.body.code, password = req.body.password, rechargeAmount = parseFloat(req.body.rechargeAmount), isAdmin = req.session.user.isAdmin; try { let card, admin, isMatch; //从session中判断是否为管理员,是则找出管理员 if (isAdmin) { let adminCode = req.session.user.code; admin = await Admin.findOne({code: adminCode}); } //找到需要充值的卡 card = await Card.findOne({code}); if (!card) { res.json(setJson(false, `登录信息错误,请重新登录`, card)); } else { if (card.isFrozen) { res.json(setJson(false, `校园卡已挂失,请先解除挂失`, null)) } //验证管理员密码或者是用户密码 if (isAdmin) { isMatch = await comparePasswordPromise(admin, password); } else { isMatch = await comparePasswordPromise(card, password); } //密码是否正确 if (isMatch) { card = await Card.findOneAndUpdate({code}, { $inc: {balance: rechargeAmount}, $addToSet: {bills: {time: Date.now(), place: '校园一卡通平台', amount: rechargeAmount, type: '充值'}} }, {new: true}); res.json(setJson(true, `充值成功`, card)) } else { res.json(setJson(false, '密码错误', null)); } } } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)) } }; //购物 exports.shop = async (req, res) => { try { let price = parseFloat(req.body.price); let place = req.body.name; let code = req.session.user.code; let card = await Card.findOne({code}); //首先判断是否挂失 if (card.isFrozen) { res.json(setJson(false, `校园卡已挂失,请先解除挂失`, null)) } //判断余额是否充足 else if (card.balance >= price) { card = await Card.findOneAndUpdate({code}, { $inc: {balance: -price}, $addToSet: {bills: {time: Date.now(), place: place, amount: price, type: '消费'}} }, {new: true}); res.json(setJson(true, `消费成功`, card)) } else { res.json(setJson(false, `余额不足,请充值`, null)) } } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)) } }; //流水列表 exports.billList = async (req, res) => { let code = req.body.code, date = req.body.date; try { let card = await Card.findOne({code}, 'cardholder bills balance'); if (card) { if (date) { card.bills = card.bills.filter(bill => { let startTime = moment(date[0].substr(0, 10)), endTime = moment(date[1].substr(0, 10)), currentTime = moment(moment(bill.time).format('YYYY-MM-DD')); return !startTime.isAfter(currentTime) && !endTime.isBefore(currentTime) }); } //消费时间倒序排序 card.bills.sort((a, b) => b.time - a.time); res.json(setJson(true, '', card)) } else { res.json(setJson(false, 'not found,请确认一卡通账号是否正确', null)) } } catch (e) { console.log(e.stack); res.json(setJson(false, e.message, null)) } };