后端: 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
193 lines
7.3 KiB
Markdown
193 lines
7.3 KiB
Markdown
# 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`。
|