|
|
@@ -0,0 +1,169 @@
|
|
|
+import dayjs from 'dayjs';
|
|
|
+import { getTokenFu } from '../middleware/jwt.js';
|
|
|
+import { Dict, ZList, ZLog, ZUser } from '../model/index.js';
|
|
|
+import { passWordJia, passWordJie } from '../util/pass.js';
|
|
|
+import resSend from '../util/resSend.js';
|
|
|
+
|
|
|
+let flag = false;
|
|
|
+
|
|
|
+const objjj: any = {
|
|
|
+ 一等奖: '他抽之前肯定先撸过',
|
|
|
+ 二等奖: '让我们恭喜这个叼毛',
|
|
|
+ 三等奖: '还不错,可以奖励自己撸一发',
|
|
|
+ 四等奖: '快去扣下屁眼',
|
|
|
+ 安慰奖: 'fucccccccccccccccck',
|
|
|
+};
|
|
|
+
|
|
|
+// 篮球-----------抽奖模块----------
|
|
|
+
|
|
|
+const chouJiang = {
|
|
|
+ // 新增用户
|
|
|
+ addOrEdit: async (req: any, res: any) => {
|
|
|
+ const infoModel = new ZUser({ ...req.body, passWord: passWordJia(req.body.passWord) });
|
|
|
+ const dbUser = await ZUser.findOne({ userName: req.body.userName });
|
|
|
+ if (dbUser && dbUser._id) {
|
|
|
+ return resSend(res, 400, '用户名已存在');
|
|
|
+ } else {
|
|
|
+ infoModel.createTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
|
|
|
+ infoModel.updateTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
|
|
|
+
|
|
|
+ // 保存数据到数据库
|
|
|
+ const dbBack = await infoModel.save();
|
|
|
+ // 将文档转换为普通对象并删除密码字段
|
|
|
+ const userObj = dbBack.toObject();
|
|
|
+ delete userObj.passWord;
|
|
|
+ return resSend(res, 0, '新增用户成功', userObj);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 登录
|
|
|
+ login: async (req: any, res: any) => {
|
|
|
+ const dbUser = await ZUser.findOne({
|
|
|
+ userName: req.body.userName,
|
|
|
+ }).select('+passWord');
|
|
|
+ if (dbUser && dbUser._id) {
|
|
|
+ const pass1 = passWordJie(dbUser.passWord);
|
|
|
+ const pass2 = passWordJie(req.body.passWord);
|
|
|
+
|
|
|
+ if (pass1 === pass2) {
|
|
|
+ const dbUserJson: any = dbUser.toObject();
|
|
|
+ delete dbUserJson.passWord;
|
|
|
+
|
|
|
+ // 获取token
|
|
|
+ const token = await getTokenFu(dbUserJson);
|
|
|
+
|
|
|
+ // 登录模块记录日志,由于没有token,需要特殊处理
|
|
|
+ req.userName = dbUserJson.userName;
|
|
|
+
|
|
|
+ return resSend(res, 0, '登录他吗的成功', { user: dbUserJson, token });
|
|
|
+ } else {
|
|
|
+ return resSend(res, 400, '他吗的密码错误');
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return resSend(res, 400, '他吗的用户名错误');
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 获取用户详情
|
|
|
+ getInfo: async (req: any, res: any) => {
|
|
|
+ const { _id } = req.params;
|
|
|
+
|
|
|
+ if (!_id) return resSend(res, 400, '_id不能为空');
|
|
|
+
|
|
|
+ // 根据ID查询用户信息
|
|
|
+ const user = await ZUser.findById(_id);
|
|
|
+
|
|
|
+ if (!user) {
|
|
|
+ return resSend(res, 404, '未找到该用户');
|
|
|
+ }
|
|
|
+ return resSend(res, 0, '获取用户详情成功', user);
|
|
|
+ },
|
|
|
+ // 开启抽奖系统
|
|
|
+ open: async (req: any, res: any) => {
|
|
|
+ const introObj = await Dict.findById('695a21d939beb139780e4e21');
|
|
|
+ if (!introObj) return resSend(res, 404, '数据不存在');
|
|
|
+ introObj.description = req.body.description || '';
|
|
|
+ introObj.updateTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
|
|
|
+ await introObj.save();
|
|
|
+ return resSend(res, 0, 'ojbk');
|
|
|
+ },
|
|
|
+ getOpen: async (req: any, res: any) => {
|
|
|
+ const introObj = await Dict.findById('695a21d939beb139780e4e21');
|
|
|
+
|
|
|
+ if (!introObj) return resSend(res, 404, '数据不存在');
|
|
|
+ return resSend(res, 0, 'ojbk', introObj);
|
|
|
+ },
|
|
|
+ // 点击抽奖
|
|
|
+ start: async (req: any, res: any) => {
|
|
|
+ const realName = req.body.realName;
|
|
|
+ // 检查抽奖剩余次数
|
|
|
+ const userInfo: any = await ZUser.findOne({ realName });
|
|
|
+ if (userInfo.num <= 0) return resSend(res, 400, '抽奖次数用完了,快去厕所偷偷撸');
|
|
|
+
|
|
|
+ if (flag) return resSend(res, 400, '别人正在强奸系统,请等待');
|
|
|
+ flag = true;
|
|
|
+
|
|
|
+ // 1. 从数据库获取所有奖品
|
|
|
+ const allPrizes = await ZList.find({});
|
|
|
+
|
|
|
+ // 2. 等概率随机选择一个奖品
|
|
|
+ const randomIndex = Math.floor(Math.random() * allPrizes.length);
|
|
|
+ const selectedPrize = allPrizes[randomIndex];
|
|
|
+
|
|
|
+ // return resSend(res, 0, '666', selectedPrize);
|
|
|
+
|
|
|
+ let title = '';
|
|
|
+ // 3. 更新数据库中的剩余次数(如果是有限制次数的奖品)
|
|
|
+ if (selectedPrize.limit <= 0 || selectedPrize.limit === 999) {
|
|
|
+ // 安慰奖
|
|
|
+ title = '安慰奖';
|
|
|
+ } else {
|
|
|
+ // 不是安慰奖
|
|
|
+ // 使用原子操作减少剩余次数
|
|
|
+ const updatedPrize: any = await ZList.findOneAndUpdate(
|
|
|
+ { _id: selectedPrize._id, remaining: { $gt: 0 } },
|
|
|
+ { $inc: { remaining: -1 }, $set: { updateTime: dayjs().format('YYYY-MM-DD HH:mm:ss') } },
|
|
|
+
|
|
|
+ { new: true, runValidators: true }
|
|
|
+ );
|
|
|
+ title = updatedPrize.name;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4.减少自己的抽奖次数
|
|
|
+ await ZUser.findOneAndUpdate(
|
|
|
+ { realName, num: { $gt: 0 } },
|
|
|
+ {
|
|
|
+ $inc: {
|
|
|
+ num: -1, // 减少抽奖次数
|
|
|
+ },
|
|
|
+ $set: { updateTime: dayjs().format('YYYY-MM-DD HH:mm:ss') },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ new: true,
|
|
|
+ runValidators: true,
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ const description = objjj[title];
|
|
|
+
|
|
|
+ const resTxt = `${realName}-抽到${title},${description}`;
|
|
|
+
|
|
|
+ // 增加一条日志
|
|
|
+ const saveObj = {
|
|
|
+ description: resTxt,
|
|
|
+ createTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
|
|
|
+ };
|
|
|
+ const newLog = new ZLog(saveObj);
|
|
|
+ newLog.save();
|
|
|
+ flag = false;
|
|
|
+ return resSend(res, 0, resTxt);
|
|
|
+ },
|
|
|
+ // 获取日志列表
|
|
|
+ list: async (req: any, res: any) => {
|
|
|
+ const list = await ZLog.find().sort({ createTime: -1 });
|
|
|
+
|
|
|
+ return resSend(res, 0, 'ojbk', list);
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+export default chouJiang;
|