轻量级私有文件网盘系统
- 后端: Go + Gin + MySQL
- 前端: Vue 3 + ES Modules
- 认证: JWT
- 上传文件(支持批量上传、拖拽上传)
- 下载文件
- 删除文件/文件夹
- 重命名文件/文件夹
- 新建文件夹
- 文件搜索(当前目录内)
- 面包屑导航
- JWT 认证机制
- 路径安全校验(防止目录遍历攻击)
- 密码加密存储
kist/
├── main.go # 程序入口
├── go.mod / go.sum # Go 依赖管理
│
├── data/ # 文件存储目录
│
├── static/ # 前端静态资源
│ ├── index.html # 主页面
│ ├── login.html # 登录页面
│ ├── css/
│ │ └── style.css # 样式文件
│ └── js/
│ ├── app.js # 主入口
│ ├── api/
│ │ └── client.js # API 请求封装
│ ├── composables/
│ │ ├── useUpload.js # 上传逻辑
│ │ ├── useFiles.js # 文件列表逻辑
│ │ └── useDialog.js # 弹窗逻辑
│ └── utils/
│ └── format.js # 格式化工具函数
│
└── src/
├── models/ # 数据模型
│ ├── sqlModels.go # SQL 模型 (UserAccount, FileRecord)
│ ├── requestModels.go # 请求模型
│ ├── responseModels.go # 响应模型
│ └── fileModels.go # 文件信息模型
│
└── server/ # 服务端代码
├── handlers/ # HTTP 处理器(薄层)
│ ├── handler.go # Handler 结构体
│ ├── auth.go # 认证中间件
│ ├── upload.go # 上传处理
│ ├── download.go # 下载处理
│ ├── delete.go # 删除处理
│ ├── rename.go # 重命名处理
│ ├── folder.go # 文件夹处理
│ ├── fileInfo.go # 文件列表处理
│ └── utils.go # (已迁移)
│
├── services/ # 业务逻辑层
│ └── file_service.go # 文件服务(增删改查)
│
└── utils/ # 工具函数
├── id.go # ID 生成(Snowflake + UUID)
└── path.go # 路径安全处理
┌─────────────────────────────────────────────────────────────┐
│ HTTP Layer │
│ (handlers/) │
│ 职责:处理 HTTP 请求/响应,参数解析,调用 Service 层 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Service Layer │
│ (services/) │
│ 职责:业务逻辑,数据库操作,事务管理 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Data Layer │
│ (MySQL + GORM) │
└─────────────────────────────────────────────────────────────┘
static/js/
├── app.js # 主入口,组装各模块
├── api/ # API 请求封装(Token 统一管理)
├── composables/ # 功能模块(Composables 模式)
└── utils/ # 工具函数
| 字段 | 类型 | 说明 |
|---|---|---|
| uid | string(191) | 主键 |
| username | varchar(10) | 用户名(唯一) |
| password | varchar(20) | 密码 |
| register_time | datetime | 注册时间 |
| 字段 | 类型 | 说明 |
|---|---|---|
| uuid | string(191) | 主键 |
| uid | string(191) | 用户 ID |
| filename | varchar(255) | 文件名 |
| filepath | varchar(500) | 文件路径 |
| filesize | bigint | 文件大小 |
| is_dir | boolean | 是否为文件夹 |
| upload_time | datetime | 上传时间 |
go mod tidyCREATE DATABASE kist_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER '0x3ea'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON kist_db.* TO '0x3ea'@'localhost';
FLUSH PRIVILEGES;数据库连接配置在 main.go 的 connectDB() 函数中。
go run .服务运行在 http://localhost:8080
- 测试账号:
admin - 测试密码:
123456
GET /- 主页GET /login- 登录页面POST /login- 登录接口
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /upload | 上传文件 |
| GET | /download | 下载文件 |
| POST | /delete | 删除文件/文件夹 |
| POST | /rename | 重命名文件/文件夹 |
| POST | /folder | 创建文件夹 |
| GET | /files | 获取文件列表 |
请求头格式:
Authorization: Bearer <token>
go build -o kist.exe .- 数据库结构通过 GORM AutoMigrate 自动创建
string字段需显式指定type:varchar(N),否则会变成longtexttime.Time字段必须显式赋值(如time.Now())- 前端所有需要认证的请求都必须携带 Token
- 文件存储在
./data目录,元数据存储在 MySQL
MIT