feat: PhotoWall 毕业照存储系统初始版本

后端: Go(Gin+GORM+MySQL+Redis)
- 17张业务表(yz_pw_前缀), 自动迁移
- JWT认证(3小时) + 盐+MD5密码 + 图形验证码
- 班级CRUD/加入(8人姓名验证/邀请码)/审核/30天自动清理
- 系统配置(16项)/菜单管理(动态路由)/数据统计
- 文件MD5去重/数据隔离/账号封禁/敏感词DFA检测

前端: Vue3+Vite+Element Plus+Less+ECharts+FontAwesome
- 动态路由(数据库菜单驱动)
- 蓝白配色, H5响应式
- 登录/注册/忘记密码/个人中心
- 班级创建向导/详情/加入/列表
- 管理后台: 审核/配置/菜单/统计/用户/敏感词

数据库: MySQL 10.31.100.3:3306/photowall
管理员: hero920103 / 920103
This commit is contained in:
hero920103
2026-09-03 05:55:23 +08:00
commit 57d9866dab
82 changed files with 12668 additions and 0 deletions
+192
View File
@@ -0,0 +1,192 @@
# 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` 或设置环境变量:
```bash
# 默认配置
DB_HOST=10.31.100.3
DB_PORT=3306
DB_USER=photowall
DB_PASSWORD=Dfn47yeKpyJfwz8n
DB_NAME=photowall
```
提前在 MySQL 中创建数据库:
```sql
CREATE DATABASE photowall DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
### 3. 启动后端
```bash
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. 启动前端
```bash
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`。