Go + Gin + SQLite 高校信息查询系统:从 Flask 迁移到 Go 的实战项目
标签: Go / Gin / SQLite / 高校查询 / 全栈项目 / 权限控制 / Session认证 / 开源
原文: 微信公众号「码农先森」https://mp.weixin.qq.com/s/2xH4zAo93OVrvEgoze25Eg
GitHub: https://github.com/Army-Mark/University-Information-Retrieval
项目简介
基于 Go 语言开发的高校信息查询系统,使用 Gin 框架 + SQLite 数据库,提供完整的学校信息管理、用户认证、权限控制、搜索功能和个性化设置。
项目背景
原项目用 Flask + SQLite 实现,Docker 部署后发现资源消耗较高,于是用 Go 重写。两个项目都是 AI 对话式开发的。
技术栈
| 技术 | 版本 | 说明 |
|---|
| Go | 1.24.0 | 开发语言 |
| Gin | v1.9.1 | Web 框架 |
| SQLite | modernc.org/sqlite v1.25.0 | 数据库(纯 Go 实现) |
| bcrypt | - | 密码哈希 |
主要功能
核心功能
- ✅ 学校信息管理:增删改查,包含地址、类别、性质、排名等详细字段
- ✅ 用户认证系统:基于 Session 的登录认证,密码强度验证
- ✅ 角色权限控制:管理员 (admin) + 普通用户 (user) 两种角色
- ✅ 智能搜索:按学校 ID 或名称搜索,分页 + 缓存优化
- ✅ 滚动数据展示:首页自动滚动展示学校信息
- ✅ Logo 上传管理:支持学校 Logo 上传和管理
- ✅ 操作日志记录:记录增删改操作,便于审计追踪
- ✅ 个性化设置:主题、语言、收藏学校等配置
项目结构
school-go/
├── cmd/server/main.go # 应用入口
├── internal/
│ ├── api/
│ │ ├── handlers/ # HTTP 请求处理器
│ │ │ ├── university.go # 学校相关
│ │ │ ├── user.go # 用户相关
│ │ │ ├── settings.go # 设置相关
│ │ │ └── operation_log_handler.go # 操作日志
│ │ ├── middleware/auth.go # 认证和角色验证中间件
│ │ └── routes.go # 路由注册
│ ├── models/ # 数据模型
│ ├── repository/ # 数据访问层
│ ├── service/ # 业务逻辑层
│ ├── config/config.go # 配置加载
│ └── pkg/errors/ # 自定义错误处理
├── static/ # 静态资源(JS、Logo)
├── templates/ # HTML 模板
├── scripts/ # 工具脚本
└── go.mod / go.sum
数据库设计
用户表 (users)
| 字段 | 类型 | 说明 |
|---|
| id | INTEGER | 主键,自增 |
| username | TEXT | 用户名,唯一 |
| password | TEXT | 密码(bcrypt 哈希) |
| role | TEXT | 角色:admin / user |
学校表 (universities)
| 字段 | 类型 | 说明 |
|---|
| 学校ID | TEXT | 唯一标识 |
| 学校名称 | TEXT | 学校名称 |
| 地址 | TEXT | 学校地址 |
| 类别 | TEXT | 本科/专科等 |
| 性质 | TEXT | 公立/私立 |
| 归属部门 | TEXT | 主管部门 |
| 建校时间 | TEXT | 建校年份 |
| 占地面积 | TEXT | 校园面积 |
| 保研星级 | TEXT | 保研星级 |
| 博士/硕士点数量 | TEXT | 学位点 |
| 软科/校友会/QS/US/泰晤士排名 | TEXT | 各类排名 |
| logo_path | TEXT | Logo 路径 |
操作日志表 (operation_logs)
| 字段 | 类型 | 说明 |
|---|
| id | INTEGER | 主键 |
| operation_type | TEXT | 操作类型 |
| table_name | TEXT | 操作表名 |
| record_id | TEXT | 记录 ID |
| user_id / username | - | 操作用户 |
| operation_time | DATETIME | 操作时间 |
| old_data / new_data | TEXT | 修改前后数据 |
| ip_address | TEXT | IP 地址 |
API 文档
公开接口(无需登录)
| 方法 | 路径 | 说明 |
|---|
| GET | / | 首页 |
| GET | /search | 搜索学校(keyword, page, pageSize) |
| GET | /university/:id | 学校详情 |
| GET | /api/scrolling_data | 滚动数据 |
| POST | /api/scrolling_position | 更新滚动位置 |
认证接口
| 方法 | 路径 | 说明 |
|---|
| POST | /login | 用户登录 |
| POST | /logout | 用户注销 |
| GET | /check_login | 检查登录状态 |
需要登录的接口
| 方法 | 路径 | 权限 | 说明 |
|---|
| GET | /account | 全部 | 账户管理页面 |
| POST | /add_account | 仅管理员 | 添加账户 |
| POST | /delete_account | 仅管理员 | 删除账户 |
| POST | /upload_logo | 全部 | 上传学校 Logo |
| POST | /add_school | 全部 | 添加学校 |
| POST | /save | 全部 | 保存学校信息 |
| POST | /delete_school | 仅管理员 | 删除学校 |
| GET | /api/settings | 全部 | 获取用户设置 |
| POST | /api/settings | 全部 | 保存用户设置 |
| GET | /api/favorites | 全部 | 获取收藏学校 |
| POST | /api/favorites | 全部 | 添加收藏 |
| DELETE | /api/favorites/:id | 全部 | 移除收藏 |
权限矩阵
| 功能 | admin | user |
|---|
| 查看学校信息 | ✅ | ✅ |
| 添加学校 | ✅ | ✅ |
| 编辑学校 | ✅ | ✅ |
| 删除学校 | ✅ | ❌ |
| 管理账户 | ✅ | 仅自己 |
| 查看操作日志 | ✅ | ✅ |
| 删除操作日志 | ✅ | ❌ |
安全特性
输入验证
- XSS 防护:HTML 特殊字符转义
- SQL 注入防护:参数化查询
- 密码强度验证:至少 8 字符,必须含字母和数字
会话管理
- 安全 Cookie(HttpOnly、Secure)
- 会话有效期 24 小时
- 支持 Cookie 或请求头获取会话 ID
错误处理
- 统一错误处理中间件
- 自定义错误类型:BadRequest / Unauthorized / Forbidden / NotFound / InternalServerError
- AJAX 和普通请求返回不同格式
性能优化
| 优化项 | 说明 |
|---|
| 连接池 | 最大 25 连接,空闲 10 个 |
| 索引 | 学校 ID、学校名称、用户名自动创建索引 |
| 搜索缓存 | 减少数据库查询 |
| 静态资源 | 24 小时缓存(Cache-Control、Expires) |
快速开始
环境要求
- Go 1.20+
- SQLite3 驱动(纯 Go 实现,无需安装 C 依赖)
安装运行
# 安装依赖
go mod tidy
# 配置环境变量
cp .env.example .env
# 运行
go run cmd/server/main.go
# 或使用脚本
./run.sh # Linux/Mac
run.bat # Windows
构建
./build.sh
# 输出: school-app (或 school-app.exe)
默认账户
⚠️ 请在首次登录后立即修改密码!
环境变量
| 变量 | 默认值 | 说明 |
|---|
| PORT | 5000 | 服务器端口 |
| HOST | 0.0.0.0 | 服务器主机 |
| DB_PATH | school.db | 数据库路径 |
| FLASK_DEBUG | false | 调试模式 |
工具脚本
| 脚本 | 说明 |
|---|
scripts/check_db.go | 数据库连接和表结构检查 |
scripts/import_year.go | 批量导入学校建校时间 |
scripts/gen_password.go | 生成 bcrypt 密码哈希 |
scripts/test_auth.go | 测试用户认证功能 |
开发指南
添加新功能流程
- 在
models/ 中定义数据模型 - 在
repository/ 中实现数据访问层 - 在
service/ 中实现业务逻辑 - 在
handlers/ 中实现 HTTP 处理函数 - 在
routes.go 中注册路由 - 如需权限控制,使用
middleware.AuthRequired() 和 middleware.RoleRequired()
错误处理规范
c.Error(errors.BadRequest("错误信息", err))
c.Error(errors.Unauthorized("未授权", nil))
c.Error(errors.Forbidden("权限不足", nil))
c.Error(errors.NotFound("资源不存在", nil))
c.Error(errors.InternalServerError("服务器错误", err))
写在最后
项目一开始是用 Flask + SQLite 实现的,Docker 部署后发现资源消耗有点高,所以用 Go 重写。两个项目都是 AI 对话式写的。
核心价值
✅ Go 重写 Flask 项目 —— 降低 Docker 部署资源消耗的实战参考
✅ 分层架构 —— handlers / service / repository / models 清晰分层
✅ 权限控制 —— admin / user 双角色 + 中间件验证
✅ 安全特性 —— XSS 防护、SQL 注入防护、bcrypt 密码、安全 Cookie
✅ 纯 Go SQLite —— 无需 C 依赖,跨平台构建
✅ AI 对话式开发 —— 全程用 AI 辅助编写
适合谁?
- 学习 Go Web 开发的初学者(项目结构规范、分层清晰)
- Flask → Go 迁移的参考
- 高校信息管理系统的快速搭建
相关链接
Keywords: Go, Gin, SQLite, 高校信息查询, 全栈项目, 权限控制, Session认证, Flask迁移Go, 分层架构, 开源项目