2
0
Просмотр исходного кода

✨ feat(api): 添加多个新API路由模块

- 引入并注册classroom-data、submission-records、stock-data等新API路由
- 为新增路由添加类型导出,完善类型系统

♻️ refactor(socket): 重构Socket.IO事件处理架构

- 将认证中间件重构为工厂函数createSocketAuthMiddleware
- 引入ExamHandler类管理考试相关事件,优化事件处理逻辑
- 移除示例聊天消息和管理员命名空间等未使用代码
- 改进事件注册方式,提高可维护性和扩展性
yourname 7 месяцев назад
Родитель
Сommit
de3ea3c16a
2 измененных файлов с 28 добавлено и 51 удалено
  1. 18 0
      src/server/api.ts
  2. 10 51
      src/server/socket.ts

+ 18 - 0
src/server/api.ts

@@ -4,6 +4,12 @@ import { errorHandler } from './utils/errorHandler'
 import usersRouter from './api/users/index'
 import authRoute from './api/auth/index'
 import rolesRoute from './api/roles/index'
+import classroomDataRoutes from './api/classroom-data/index'
+import submissionRecordsRoutes from './api/submission-records/index'
+import stockDataRoutes from './api/stock-data/index'
+import stockXunlianCodesRoutes from './api/stock-xunlian-codes/index'
+import dateNotesRoutes from './api/date-notes/index'
+import aliyunRoute from './api/aliyun/index'
 import { AuthContext } from './types/context'
 import { AppDataSource } from './data-source'
 import { Hono } from 'hono'
@@ -77,10 +83,22 @@ if(!import.meta.env.PROD){
 const userRoutes = api.route('/api/v1/users', usersRouter)
 const authRoutes = api.route('/api/v1/auth', authRoute)
 const roleRoutes = api.route('/api/v1/roles', rolesRoute)
+const classroomDataApi = api.route('/api/v1/classroom-data', classroomDataRoutes)
+const submissionRecordsApi = api.route('/api/v1/submission-records', submissionRecordsRoutes)
+const stockDataApi = api.route('/api/v1/stock-data', stockDataRoutes)
+const stockXunlianCodesApi = api.route('/api/v1/stock-xunlian-codes', stockXunlianCodesRoutes)
+const dateNotesApi = api.route('/api/v1/date-notes', dateNotesRoutes)
+const aliyunApi = api.route('/api/v1/aliyun', aliyunRoute)
 
 export type AuthRoutes = typeof authRoutes
 export type UserRoutes = typeof userRoutes
 export type RoleRoutes = typeof roleRoutes
+export type ClassroomDataRoutes = typeof classroomDataApi
+export type SubmissionRecordsRoutes = typeof submissionRecordsApi
+export type StockDataRoutes = typeof stockDataApi
+export type StockXunlianCodesRoutes = typeof stockXunlianCodesApi
+export type DateNotesRoutes = typeof dateNotesApi
+export type AliyunRoutes = typeof aliyunApi
 
 app.route('/', api)
 export default app

+ 10 - 51
src/server/socket.ts

@@ -1,33 +1,13 @@
 // src/server/socket.ts
-import { Server, Socket } from 'socket.io';
+import { Server } from 'socket.io';
+import { createSocketAuthMiddleware } from './socket/middleware/auth.middleware';
+import { ExamHandler } from './socket/handlers/exam.handler';
 
 /**
  * Socket.IO 认证中间件
  * 可以在这里实现基于 token 或其他方式的认证
  */
-export const authMiddleware = async (socket: Socket, next: (err?: Error) => void) => {
-  try {
-    // 从握手信息中获取认证数据
-    const token = socket.handshake.auth.token;
-    
-    if (!token) {
-      return next(new Error('未提供认证令牌'));
-    }
-    
-    // 实现你的认证逻辑
-    // 例如: 验证 JWT 令牌
-    // const user = await verifyToken(token);
-    
-    // 如果认证成功,可以将用户信息附加到 socket 对象
-    // socket.data.user = user;
-    
-    console.log(`客户端认证成功: ${socket.id}`);
-    next();
-  } catch (err) {
-    console.error(`客户端认证失败: ${socket.id}`, err);
-    next(new Error('认证失败'));
-  }
-};
+export const authMiddleware = createSocketAuthMiddleware();
 
 /**
  * Socket.IO 路由处理
@@ -35,46 +15,25 @@ export const authMiddleware = async (socket: Socket, next: (err?: Error) => void
  */
 export default (io: Server) => {
   console.log('注册 Socket.IO 事件处理');
+
+  // 初始化事件处理器
+  const examHandler = new ExamHandler(io);
   
   // 全局命名空间事件
   io.on('connection', (socket) => {
     console.log(`客户端连接: ${socket.id}`);
+
+    // 注册事件处理器
+    examHandler.register(socket);
     
     // 示例: 响应客户端的 ping 事件
     socket.on('ping', (callback) => {
       callback({ timestamp: Date.now() });
     });
     
-    // 示例: 处理自定义事件
-    socket.on('chat_message', (data) => {
-      console.log(`收到消息: ${JSON.stringify(data)}`);
-      // 广播消息给其他用户
-      socket.broadcast.emit('new_message', {
-        ...data,
-        from: socket.id,
-        timestamp: Date.now()
-      });
-    });
-    
     // 断开连接事件
     socket.on('disconnect', (reason) => {
       console.log(`客户端断开连接: ${socket.id}, 原因: ${reason}`);
     });
   });
-  
-  // 示例: 创建命名空间
-  const adminNamespace = io.of('/admin');
-  
-  adminNamespace.on('connection', (socket) => {
-    console.log(`管理员连接: ${socket.id}`);
-    
-    // 管理员专属事件
-    socket.on('dashboard_stats', (callback) => {
-      // 模拟返回统计数据
-      callback({
-        onlineUsers: io.engine.clientsCount,
-        rooms: io.sockets.adapter.rooms.size
-      });
-    });
-  });
 };