shaogen1995 3 tygodni temu
rodzic
commit
91c0d1d27d

+ 2 - 1
src/controller/inedx.ts

@@ -2,5 +2,6 @@ import user from './userController.js';
 import issue from './issueController.js';
 import file from './fileController.js';
 import audit from './auditController.js';
+import chouJiang from './zChouJiang.js';
 
-export { user, issue, file, audit };
+export { user, issue, file, audit, chouJiang };

+ 169 - 0
src/controller/zChouJiang.ts

@@ -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;

+ 23 - 1
src/middleware/jwt.ts

@@ -4,7 +4,7 @@ import jwt from 'jsonwebtoken';
 import { promisify } from 'util';
 import resSend from '../util/resSend.js';
 import { tokenKey } from '../config/config.default.js';
-import { User } from '../model/index.js';
+import { User, ZUser } from '../model/index.js';
 
 const toiwt: any = promisify(jwt.sign);
 
@@ -39,3 +39,25 @@ export const verifyToken = async (req: any, res: any, next: any) => {
     return resSend(res, 401, '用户凭证无效');
   }
 };
+
+// 抽奖模块接口处理token中间件
+export const verifyToken2 = async (req: any, res: any, next: any) => {
+  // 获取请求头里面的token
+  let token = req.headers.token || '';
+
+  if (!token) return resSend(res, 401, '请传入用户凭证');
+
+  try {
+    const decoded = await verify(token, tokenKey);
+
+    const user = await ZUser.findById(decoded._id);
+    if (!user) return resSend(res, 401, '用户不存在或已被删除');
+
+    // 用户信息存起来
+    req.user = user;
+
+    next();
+  } catch (error) {
+    return resSend(res, 401, '用户凭证无效');
+  }
+};

+ 13 - 0
src/middleware/validator/zChouJiang.ts

@@ -0,0 +1,13 @@
+import errorBack from './errorBack.js';
+import { body } from 'express-validator';
+
+// 抽奖模块-登录
+export const zChouJiangLoginVali = errorBack([
+  body('userName')
+    .notEmpty()
+    .withMessage('帐号空了伙计')
+    .bail()
+    .isLength({ min: 5, max: 15 })
+    .withMessage('长度为5~15个字符伙计'),
+  body('passWord').notEmpty().withMessage('密码空了伙计'),
+]);

+ 7 - 0
src/model/index.ts

@@ -10,6 +10,9 @@ import auditSchema from './auditModel.js';
 import auditFileSchema from './auditFileModel.js';
 import dictSchema from './dictModel.js';
 import fileSchema from './fileModel.js';
+import zUserSchema from './zUserModel.js';
+import zLogSchema from './zLogModel.js';
+import zListSchema from './zlistModel.js';
 
 const main = async () => {
   await mongoose.connect(mongodbUrl);
@@ -33,3 +36,7 @@ export const Advanced = mongoose.model('advanced', AdvancedSchema);
 export const Share = mongoose.model('share', ShareSchema);
 export const AuditFile = mongoose.model('auditFile', auditFileSchema);
 export const Audit = mongoose.model('audit', auditSchema);
+// 抽奖系统(和这个项目无关,另外的一个延伸系统)
+export const ZUser = mongoose.model('zUser', zUserSchema);
+export const ZLog = mongoose.model('zLog', zLogSchema);
+export const ZList = mongoose.model('zList', zListSchema);

+ 16 - 0
src/model/zLogModel.ts

@@ -0,0 +1,16 @@
+import dayjs from 'dayjs';
+import mongoose from 'mongoose';
+
+const zLogSchema = new mongoose.Schema({
+  description: {
+    type: String,
+    default: '',
+  },
+
+  createTime: {
+    type: String,
+    default: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+  },
+});
+
+export default zLogSchema;

+ 37 - 0
src/model/zUserModel.ts

@@ -0,0 +1,37 @@
+import dayjs from 'dayjs';
+import mongoose from 'mongoose';
+
+const zUserSchema = new mongoose.Schema({
+  userName: {
+    type: String,
+    require: true,
+  },
+  passWord: {
+    type: String,
+    require: true,
+    select: false, //查询的时候不返回这个参数
+  },
+  isAdmin: {
+    type: Number,
+    default: 0,
+  },
+  realName: {
+    type: String,
+    default: '',
+  },
+  num: {
+    type: Number,
+    default: 0,
+  },
+
+  createTime: {
+    type: String,
+    default: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+  },
+  updateTime: {
+    type: String,
+    default: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+  },
+});
+
+export default zUserSchema;

+ 28 - 0
src/model/zlistModel.ts

@@ -0,0 +1,28 @@
+import dayjs from 'dayjs';
+import mongoose from 'mongoose';
+
+const zListSchema = new mongoose.Schema({
+  name: {
+    type: String,
+    require: true,
+  },
+  limit: {
+    type: Number,
+    default: 0,
+  },
+  remaining: {
+    type: Number,
+    default: 0,
+  },
+
+  createTime: {
+    type: String,
+    default: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+  },
+  updateTime: {
+    type: String,
+    default: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+  },
+});
+
+export default zListSchema;

+ 4 - 0
src/router/index.ts

@@ -4,6 +4,7 @@ import issueRouter from './issue.js';
 import fileRouter from './file.js';
 import showRouter from './show.js';
 import auditRouter from './audit.js';
+import chouJiangRouter from './zChouJiang.js';
 
 const router = express.Router();
 
@@ -15,4 +16,7 @@ router.use('/file', fileRouter);
 // 展示端
 router.use('/show', showRouter);
 
+// 篮球-抽奖模块
+router.use('/choujiang', chouJiangRouter);
+
 export default router;

+ 24 - 0
src/router/zChouJiang.ts

@@ -0,0 +1,24 @@
+import express from 'express';
+import { zChouJiangLoginVali } from '../middleware/validator/zChouJiang.js';
+import { chouJiang } from '../controller/inedx.js';
+import { verifyToken2 } from '../middleware/jwt.js';
+const chouJiangRouter = express.Router();
+
+// 篮球抽奖模块
+
+chouJiangRouter
+  //用户登录
+  .post('/login', zChouJiangLoginVali, chouJiang.login)
+  // 创建用户
+  .post('/add', zChouJiangLoginVali, chouJiang.addOrEdit)
+  // 获取用户详情
+  .get('/getInfo/:_id', verifyToken2, chouJiang.getInfo)
+  // 开启抽奖系统
+  .post('/open', verifyToken2, chouJiang.open)
+  .get('/getOpen', verifyToken2, chouJiang.getOpen)
+  // 点击抽奖
+  .post('/start', verifyToken2, chouJiang.start)
+  // 获取日志列表
+  .get('/list', verifyToken2, chouJiang.list);
+
+export default chouJiangRouter;