master
PhotoWall 毕业照存储系统
全球学校毕业照存储与同学联络平台。支持国家→省/州→县/区三级组织架构,班级唯一毕业照,每人每班级10张个人照片,8人姓名验证加入,平台审核机制。
技术栈
- 后端: Go (Gin + GORM + MySQL + Redis)
- 前端: Vue3 + Vite + Element Plus + Less + ECharts + FontAwesome
- 数据库: MySQL 5.7+ (utf8mb4, 表前缀
yz_pw_) - 认证: JWT (3小时有效期) + 盐+MD5密码 + 图形验证码
快速启动
1. 环境要求
- Go 1.21+
- Node.js 16+
- MySQL 5.7+ (需提前创建数据库
photowall) - Redis (可选,未安装时自动降级为内存模式)
2. 数据库配置
编辑 go/internal/config/config.go 或设置环境变量:
# 默认配置
DB_HOST=10.31.100.3
DB_PORT=3306
DB_USER=photowall
DB_PASSWORD=Dfn47yeKpyJfwz8n
DB_NAME=photowall
提前在 MySQL 中创建数据库:
CREATE DATABASE photowall DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. 启动后端
cd go
go run ./cmd/server
# 或编译后运行
go build -o photowall.exe ./cmd/server
./photowall.exe
后端启动后自动:
- 连接 MySQL 并创建所有数据表(表前缀
yz_pw_) - 创建超级管理员账号
hero920103/ 密码920103 - 初始化16项系统配置、20个默认菜单、示例地区数据(中/美/英/日)
- 启动定时任务(每小时检查过期班级,30天未补齐自动删除)
后端端口:8010
4. 启动前端
cd vue
npm install
npm run dev
前端端口:8011,自动代理 /api 和 /uploads 到后端 8010。
5. 登录
- 管理员账号:
hero920103/920103 - 开发万能验证码:
888888(任意 captcha_id 均可通过)
功能清单
用户系统
- 注册/登录(图形验证码)
- 忘记密码(邮箱重置码,开发模式直接返回)
- 短信验证码登录(预留,需配置短信服务商)
- 微信扫码登录(预留,需配置微信开放平台)
- JWT 3小时有效期,超时强制跳转登录
- 盐+MD5密码加密
- 个人资料管理(昵称、邮箱、简介)
- 学习履历管理(必须有履历才能创建班级)
- 联系方式管理(邮箱2/QQ5/微信2/手机5/住址1/工作单位1)
组织架构
- 三级地区:国家 → 省/州 → 县/区(最低级是县)
- 学校管理(大学/职业学校/高中/初中/小学/幼儿园/其他)
- 学院管理(仅大学/职业学校有学院层级)
- 示例地区种子数据(中国含江苏连云港海州区)
班级系统
- 班级创建(4步向导:选地区→选学校→填信息→上传毕业照+同学名单)
- 班级唯一性约束(学校+学院+年级+班号+毕业年份)
- 毕业照唯一(每个班级一张)
- 同学名单(创建时必须录入,至少8人)
- 老师名单
- 每人每班级最多10张个人照片
- 加入班级两种方式:
- 管理员邀请码
- 搜索+正确说出至少8位同学姓名
- 管理员转移(只能转给同班同学)
- 成员管理(移除成员)
审核机制
- 班级创建后进入待审核状态
- 少于8人直接打回
- 平台管理员巡查发现照片与名单不符可打回
- 打回后30天内未补齐自动删除班级
- 审核日志记录
平台管理
- 数据统计仪表盘(用户/学校/班级/照片核心指标 + 增长趋势 + 分布图表 + 地区TOP10)
- 系统配置管理(16项配置,5个分类:基础/极验/短信/微信/存储)
- 菜单管理(动态路由数据源,树形结构,增删改查)
- 用户管理(封禁/解封账号,封禁原因记录)
- 敏感词全局屏蔽(DFA算法,增删改查,启用/禁用)
- 审核管理(审核队列、通过、打回、手动删除、审核日志)
技术特性
- 动态路由(菜单存储在数据库,登录后按角色动态加载)
- 文件上传MD5去重(重复文件直接返回已有路径,ref_count引用计数)
- 数据隔离(班级照片和联系方式只有班级成员或管理员可见)
- Redis集成(验证码/缓存,连接失败自动降级内存模式)
- 敏感词检测(班级创建时自动检测名称)
- 账号封禁(被封禁用户无法登录)
- H5响应式适配
- CORS跨域支持
目录结构
photowall/
├── go/ # 后端
│ ├── cmd/server/main.go # 入口
│ ├── internal/
│ │ ├── config/ # 配置
│ │ ├── database/ # 数据库连接+迁移+种子
│ │ ├── model/ # 数据模型(16+张表)
│ │ ├── service/ # 业务逻辑
│ │ ├── handler/ # HTTP处理器
│ │ ├── middleware/ # 中间件(JWT认证)
│ │ ├── router/ # 路由注册
│ │ └── scheduler/ # 定时任务
│ ├── pkg/ # 工具包
│ │ ├── jwt/ # JWT
│ │ ├── hash/ # 盐+MD5
│ │ ├── response/ # 统一响应
│ │ ├── captcha/ # 图形验证码
│ │ ├── redis/ # Redis+内存降级
│ │ └── sensitive/ # DFA敏感词检测
│ ├── uploads/ # 上传文件目录
│ └── photowall.exe # 编译产物
├── vue/ # 前端
│ ├── src/
│ │ ├── api/ # API封装
│ │ ├── assets/ # 全局样式(Less蓝白配色)
│ │ ├── composables/ # useAuth等
│ │ ├── router/ # 动态路由
│ │ ├── views/ # 页面
│ │ │ ├── auth/ # 登录/注册/忘记密码
│ │ │ ├── home/ # 首页
│ │ │ ├── class/ # 班级(list/edit/detail/join)
│ │ │ ├── normalsettings/ # 个人中心等
│ │ │ └── admin/ # 管理(审核/配置/菜单/统计/用户/敏感词)
│ │ ├── App.vue # 布局(侧边栏+顶部栏)
│ │ └── main.js # 入口
│ └── dist/ # 构建产物
└── doc/ # 文档
└── 立项说明.md # 开发基准文档
第三方服务配置
在「系统管理 → 系统配置」中配置以下参数(留空则处于开发模式):
| 分类 | 配置项 | 获取地址 |
|---|---|---|
| 极验 | geetest_id / geetest_key | https://www.geetest.com |
| 短信 | sms_access_key / sms_secret_key / sms_sign_name / sms_template_code | 阿里云/腾讯云短信控制台 |
| 微信 | wechat_app_id / wechat_app_secret / wechat_redirect_uri | https://open.weixin.qq.com |
开发说明
- 开发万能验证码:
888888 - 忘记密码重置码:开发模式直接在接口返回(生产需配置SMTP邮件服务)
- 短信验证码:开发模式直接返回(需配置短信服务商后真实发送)
- Redis:未安装时自动降级为内存模式,不影响功能
- 表前缀:所有业务表均以
yz_pw_开头
UniApp 版本
规划中,用于生成 APK 和小程序端源码。详见 doc/立项说明.md。
Languages
Go
48.2%
Vue
46%
JavaScript
2.7%
CSS
1.6%
Less
1.4%