You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
test/server/controllers/Card.js

394 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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))
}
};