# inform-manage-sys **Repository Path**: WaterWhisperer/inform-manage-sys ## Basic Information - **Project Name**: inform-manage-sys - **Description**: 2025 信息管理系统实践 浅尝Go开发Web - **Primary Language**: Go - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-11-30 - **Last Updated**: 2026-01-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 面向创新实践的实验室算力资源预约系统 ## 项目简介 本系统是一个基于Go语言和PostgreSQL的实验室算力资源预约管理系统,用于高校创新实验室的GPU服务器、工作站等算力资源的预约和管理。 ## 技术栈 - **后端**: Go 1.24.4 + Gin框架 - **数据库**: PostgreSQL 18.1 (Docker) - **ORM**: GORM - **前端**: Bootstrap 5 + Bootstrap Icons - **认证**: Cookie-based Session (7天有效期) ## 功能特性 ### 用户角色与权限 | 功能 | 学生 | 教师 | 管理员 | | -------------- | ---- | ---- | ------ | | 查看资源 | ✅ | ✅ | ✅ | | 预约资源 | ✅ | ✅ | ✅ | | 取消自己的预约 | ✅ | ✅ | ✅ | | 查看我的预约 | ✅ | ✅ | ✅ | | 管理实验室 | ❌ | ✅ | ✅ | | 管理资源 | ❌ | ✅ | ✅ | | 审核预约 | ❌ | ✅ | ✅ | | 删除实验室/资源| ❌ | ❌ | ✅ | | 用户管理 | ❌ | ❌ | ✅ | | 公告管理 | ❌ | ❌ | ✅ | | 统计分析 | ❌ | ❌ | ✅ | | 系统日志 | ❌ | ❌ | ✅ | ### 核心功能 1. **用户管理**: 支持学生、教师、管理员三种角色的增删改查 2. **实验室管理**: 实验室信息CRUD,支持负责人分配和启用/停用状态 3. **资源管理**: GPU服务器、CPU服务器、工作站、虚拟机等算力资源管理 4. **预约功能**: 资源预约申请、管理员审核(通过/拒绝)、用户取消 5. **预约冲突检测**: 数据库触发器自动检测时间冲突,防止重复预约 6. **公告系统**: 系统公告发布、上架/下架管理 7. **统计分析**: 用户总数、资源总数、预约状态分布、资源使用排行、用户预约排行 8. **操作日志**: 用户登录/登出、预约、取消、审核等操作自动记录 ## 数据库设计 ### 数据表(6张) | 表名 | 说明 | 主要字段 | |------|------|----------| | users | 用户表 | id, username, password, real_name, email, role, is_active | | labs | 实验室表 | id, name, location, description, manager_id, is_active | | resources | 资源表 | id, lab_id, name, type, cpu_cores, memory_gb, gpu_model, gpu_count, status | | reservations | 预约表 | id, user_id, resource_id, start_time, end_time, purpose, status | | announcements | 公告表 | id, title, content, publisher_id, is_active | | usage_logs | 操作日志表 | id, user_id, resource_id, action, details, ip_address | ### 数据库特性 - **外键约束**: 用户→预约、资源→预约、实验室→资源等关联完整性 - **触发器**: 预约时间冲突自动检测 - **多表连接**: 资源预约信息、用户信息、实验室信息关联查询 ## 快速开始 ### 1. 启动PostgreSQL数据库 ```bash docker run --name postgres-lab \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=1 \ -e POSTGRES_DB=lab_reservation \ -p 5433:5432 \ -d postgres:latest ``` ### 2. 安装依赖 ```bash cd inform-manage-sys go mod tidy ``` ### 3. 运行项目 ```bash go run main.go # 或编译后运行 go build -o lab-system && ./lab-system ``` ### 4. 访问系统 打开浏览器访问: [http://localhost:8080](http://localhost:8080) ### 5. 测试账户 | 用户名 | 密码 | 角色 | 姓名 | | -------- | ---------- | ------ | ---- | | admin | admin123 | 管理员 | 系统管理员 | | teacher1 | teacher123 | 教师 | 张教授 | | student1 | student123 | 学生 | 李明 | | student2 | student123 | 学生 | 王芳 | ## 项目结构 ```tree inform-manage-sys/ ├── main.go # 主入口,模板函数注册 ├── go.mod # Go模块定义 ├── go.sum # 依赖版本锁定 ├── lab-system # 编译后的可执行文件 ├── config/ │ └── config.go # 数据库和服务器配置 ├── database/ │ └── database.go # 数据库初始化、自动迁移、种子数据 ├── models/ │ ├── user.go # 用户模型 │ ├── lab.go # 实验室模型 │ ├── resource.go # 资源模型 │ ├── reservation.go # 预约模型 │ ├── announcement.go # 公告模型 │ └── usage_log.go # 操作日志模型 ├── handlers/ │ ├── user.go # 用户处理器(登录/注销/CRUD/日志记录) │ ├── lab.go # 实验室处理器 │ ├── resource.go # 资源处理器 │ ├── reservation.go # 预约处理器(创建/取消/审核) │ ├── announcement.go # 公告处理器 │ └── stats.go # 统计和日志处理器 ├── routes/ │ └── routes.go # 路由定义(含认证中间件) └── templates/ ├── layout.html # 布局模板(导航栏/页脚) ├── login.html # 登录页面 ├── error.html # 错误页面 ├── index.html # 首页(公告+资源预约) ├── my.html # 我的预约 ├── users.html # 用户管理 ├── labs.html # 实验室管理 ├── resources.html # 资源管理 ├── announcements.html # 公告管理 ├── admin_reservations.html # 预约审核 ├── stats.html # 统计分析 └── logs.html # 操作日志 ``` ## API路由 ### 页面路由(需登录) | 方法 | 路径 | 说明 | |------|------|------| | GET | / | 首页(资源列表+预约) | | GET | /my | 我的预约 | | POST | /reserve | 提交预约 | | POST | /reservations/:id/cancel | 取消预约 | | GET | /users | 用户管理页面 | | POST | /users | 创建用户 | | POST | /users/:id/update | 更新用户 | | POST | /users/:id/delete | 删除用户 | | GET | /labs | 实验室管理页面 | | POST | /labs | 创建实验室 | | POST | /labs/:id/update | 更新实验室 | | POST | /labs/:id/delete | 删除实验室 | | GET | /resources | 资源管理页面 | | POST | /resources | 创建资源 | | POST | /resources/:id/update | 更新资源 | | POST | /resources/:id/delete | 删除资源 | | GET | /announcements | 公告管理页面 | | POST | /announcements | 发布公告 | | POST | /announcements/:id/toggle | 切换公告状态 | | POST | /announcements/:id/delete | 删除公告 | | GET | /admin/reservations | 预约审核页面 | | POST | /admin/reservations/:id/approve | 通过预约 | | POST | /admin/reservations/:id/reject | 拒绝预约 | | GET | /stats | 统计分析 | | GET | /logs | 操作日志 | ### RESTful API(供前后端分离使用) 系统同时提供 `/api/*` 路径的RESTful接口,返回JSON格式数据,可用于前后端分离架构或第三方集成。 ## 技术要点 ### 1. 预约冲突检测(数据库触发器) ```sql CREATE OR REPLACE FUNCTION check_reservation_conflict() RETURNS TRIGGER AS $$ BEGIN IF EXISTS ( SELECT 1 FROM reservations WHERE resource_id = NEW.resource_id AND id != COALESCE(NEW.id, 0) AND status != 'cancelled' AND (NEW.start_time, NEW.end_time) OVERLAPS (start_time, end_time) ) THEN RAISE EXCEPTION 'Reservation time conflict'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; ``` ### 2. 认证中间件 ```go func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { userID, err := c.Cookie("user_id") if err != nil || userID == "" { c.Redirect(302, "/login") c.Abort() return } var user models.User if err := database.DB.First(&user, userID).Error; err != nil { c.SetCookie("user_id", "", -1, "/", "", false, true) c.Redirect(302, "/login") c.Abort() return } c.Set("currentUser", &user) c.Next() } } ``` ### 3. 操作日志记录 ```go func LogAction(c *gin.Context, userID *uint, resourceID *uint, action, details string) { log := models.UsageLog{ UserID: userID, ResourceID: resourceID, Action: action, Details: details, IPAddress: c.ClientIP(), } database.DB.Create(&log) } ``` ### 4. 模板权限控制 ```html {{ if and .currentUser (eq .currentUser.Role "admin") }} {{ end }} {{ if and .currentUser (or (eq .currentUser.Role "admin") (eq .currentUser.Role "teacher")) }} {{ end }} ``` ## 配置说明 配置文件位于 `config/config.go`: ```go const ( DBHost = "localhost" DBUser = "postgres" DBPassword = "1" DBName = "lab_reservation" DBPort = "5433" DBSSLMode = "disable" DBTimezone = "Asia/Shanghai" ServerPort = ":8080" ) ``` ## 系统整体流程图 ```mermaid flowchart TD Start([开始]) --> Login[用户登录] Login --> CheckRole{检查角色} CheckRole -->|学生/教师| BrowseResources[浏览资源] CheckRole -->|管理员| AdminDashboard[管理员面板] BrowseResources --> ViewDetails[查看资源详情] ViewDetails --> CheckAvailability{检查可用性} CheckAvailability -->|可用| SubmitReservation[提交预约申请] CheckAvailability -->|不可用| WaitOrChoose[等待或选择其他资源] WaitOrChoose --> BrowseResources SubmitReservation --> StorePending[存储为待审核状态] StorePending --> NotifyAdmin[通知管理员/教师] AdminDashboard --> ReviewReservations[审核预约申请] ReviewReservations --> Decision{审核决定} Decision -->|通过| Approve[批准预约] Decision -->|拒绝| Reject[拒绝预约] Approve --> UpdateStatus[更新状态为已批准] UpdateStatus --> NotifyUser[通知用户] NotifyUser --> ResourceAllocated[资源分配完成] Reject --> UpdateStatusReject[更新状态为已拒绝] UpdateStatusReject --> NotifyUserReject[通知用户] ResourceAllocated --> UsagePeriod[使用期间] UsagePeriod --> CheckCompletion{使用完成?} CheckCompletion -->|是| ReleaseResource[释放资源] CheckCompletion -->|否| ContinueUsage[继续使用] ContinueUsage --> UsagePeriod ReleaseResource --> LogUsage[记录使用日志] LogUsage --> End([结束]) %% 取消流程 SubmitReservation -.->|用户取消| CancelReservation[取消预约] StorePending -.->|用户取消| CancelReservation CancelReservation --> UpdateStatusCancel[更新状态为已取消] UpdateStatusCancel --> NotifyAdminCancel[通知管理员] %% 样式定义 classDef user fill:#e1f5fe,stroke:#01579b classDef admin fill:#f3e5f5,stroke:#4a148c classDef system fill:#e8f5e8,stroke:#1b5e20 classDef decision fill:#fff3e0,stroke:#e65100 class Start,Login,BrowseResources,ViewDetails,SubmitReservation,WaitOrChoose,UsagePeriod,ContinueUsage user class AdminDashboard,ReviewReservations,Approve,Reject,NotifyAdmin admin class StorePending,UpdateStatus,ResourceAllocated,ReleaseResource,LogUsage system class CheckRole,CheckAvailability,Decision,CheckCompletion decision ``` ## 预约状态流转 ```mermaid stateDiagram-v2 [*] --> pending: 用户提交预约 pending --> approved: 管理员/教师通过 pending --> rejected: 管理员/教师拒绝 pending --> cancelled: 用户取消 pending: 待审核 approved: 已通过 rejected: 已拒绝 cancelled: 已取消 ```