# 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: 已取消
```