编程 Go + Gin + SQLite 高校信息查询系统:从 Flask 迁移到 Go 的实战项目

2026-06-14 09:20:29 +0800 CST views 12

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 对话式开发的。


技术栈

技术版本说明
Go1.24.0开发语言
Ginv1.9.1Web 框架
SQLitemodernc.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)

字段类型说明
idINTEGER主键,自增
usernameTEXT用户名,唯一
passwordTEXT密码(bcrypt 哈希)
roleTEXT角色:admin / user

学校表 (universities)

字段类型说明
学校IDTEXT唯一标识
学校名称TEXT学校名称
地址TEXT学校地址
类别TEXT本科/专科等
性质TEXT公立/私立
归属部门TEXT主管部门
建校时间TEXT建校年份
占地面积TEXT校园面积
保研星级TEXT保研星级
博士/硕士点数量TEXT学位点
软科/校友会/QS/US/泰晤士排名TEXT各类排名
logo_pathTEXTLogo 路径

操作日志表 (operation_logs)

字段类型说明
idINTEGER主键
operation_typeTEXT操作类型
table_nameTEXT操作表名
record_idTEXT记录 ID
user_id / username-操作用户
operation_timeDATETIME操作时间
old_data / new_dataTEXT修改前后数据
ip_addressTEXTIP 地址

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全部移除收藏

权限矩阵

功能adminuser
查看学校信息
添加学校
编辑学校
删除学校
管理账户仅自己
查看操作日志
删除操作日志

安全特性

输入验证

  • 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)

默认账户

  • 用户名:admin
  • 密码:admin123

⚠️ 请在首次登录后立即修改密码!

环境变量

变量默认值说明
PORT5000服务器端口
HOST0.0.0.0服务器主机
DB_PATHschool.db数据库路径
FLASK_DEBUGfalse调试模式

工具脚本

脚本说明
scripts/check_db.go数据库连接和表结构检查
scripts/import_year.go批量导入学校建校时间
scripts/gen_password.go生成 bcrypt 密码哈希
scripts/test_auth.go测试用户认证功能

开发指南

添加新功能流程

  1. models/ 中定义数据模型
  2. repository/ 中实现数据访问层
  3. service/ 中实现业务逻辑
  4. handlers/ 中实现 HTTP 处理函数
  5. routes.go 中注册路由
  6. 如需权限控制,使用 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, 分层架构, 开源项目

推荐文章

MySQL死锁 - 更新插入导致死锁
2024-11-19 05:53:50 +0800 CST
html一个全屏背景视频
2024-11-18 00:48:20 +0800 CST
PostgreSQL日常运维命令总结分享
2024-11-18 06:58:22 +0800 CST
html一个包含iPhoneX和MacBook模拟器
2024-11-19 08:03:47 +0800 CST
程序员茄子在线接单