fe7615d12b
一、部署配置清理
docker-compose.yml 里的 MinIO 删了(连 minio-data 卷)。它当初是
"M0 阶段不写入但先起好 —— 本地/生产走同一套 S3 接口",但代码最终走
七牛官方 SDK,那个容器**从来没被连过** —— 留着只会让人以为"本地还有个
对象存储要用"。.env.example / .env 的 MINIO_* 换成 QINIU_* + XT_STORAGE_*。
⚠️ 删的时候我自己犯了个错:用 volumes:\n 当插入锚点,结果匹配到了
**pg 服务内部的 ` volumes:`**,把注释插进 pg 定义里还把它顶到第 0 列,
**YAML 结构就这么坏了**。好在写完立刻用 yaml.safe_load 复查(services: [pg, redis])
才发现。教训:改 YAML 之后一定要解析一遍,别靠肉眼看缩进。
二、学生端材料预览(新功能)
已传材料每行加「预览」,点开全屏浮层(深底 —— 材料照片多是白底证件件,
浅底会看不清边界),点图片以外关闭。
**两种存储两种取法,不能只写一种**:
· 七牛:接口返回带签名的绝对 URL,直接给 <image src> 用
· 本地磁盘:那个接口要带 Authorization,而 <image src> 发不了请求头 ——
先用 uni.request 取字节,再转 blob URL
只写七牛那一种,本地开发时预览会一片空白,而**原因完全看不出来**。
签名链接有有效期(30 分钟),所以每次预览都现取,不缓存 URL。
顺手修两个后端问题:
· LocalStorageService.url() 返回的路径指向一个**不存在的接口**
(我建的是 /{id}/content,不是 ?path=)→ 改由 MaterialFileService 按
provider 决定:七牛给签名链接、本地给 /{id}/content(按 id 取能复用归属校验)
· /content 原来固定 application/octet-stream —— 表现是**点开身份证照片
变成下载一个文件**。现在按文件名推 Content-Type + inline
三、浏览器实测
点预览 → 浮层打开、图片真的解码(naturalWidth=900、complete=true);
直接 fetch 那个签名 URL → 200 / 17728 字节。
中间发现一个视觉问题:**浮层标题与「关闭」被 uni-app 导航栏盖住了**
(page-head 的 z-index 是 998,我给的 95)—— 看起来像"标题没渲染出来"。
改成 9999 + padding-top 让出导航高度;问题清单浮层一并提到 9998。复验通过。
四、顺带
dev-seed-warn-state.py 改为没有可用草稿时自己建一份 —— 原来写死 submission id,
被 E2E 清理后就报"填报单不存在或不属于你",而那看起来像权限问题。
验收:e2e-m3-file 32/32、m3-submit 31/31、m1-storage 16/16
76 lines
2.5 KiB
YAML
76 lines
2.5 KiB
YAML
# 数据信息填报系统 · 本地开发基础设施
|
|
#
|
|
# 用法:
|
|
# cd deploy
|
|
# copy .env.example .env (首次)
|
|
# docker compose up -d
|
|
#
|
|
# ⚠️ 容器名统一加 xt- 前缀,端口刻意避开 55432 / 6379
|
|
# (本机已有其他项目的 pg-verify 与 redis-local 在跑,不要动它们)
|
|
#
|
|
# 对象存储:用**七牛云**,这里不起容器。
|
|
# 材料原图与规范件存七牛(空间 tools-matrix,私有 → 下载走签名链接),
|
|
# 由后端用官方 SDK 直连,不走 S3 协议。
|
|
# 曾经起过一个 MinIO 备用("本地/生产走同一套 S3 接口"),但代码最终走的是七牛 SDK,
|
|
# 那个容器从来没被连过 —— 留着只会让人以为"本地还有个对象存储要用",所以删掉了。
|
|
# 本地开发也不需要它:provider=local 时文件落在 backend/data/uploads。
|
|
|
|
name: xiaotutongxue
|
|
|
|
services:
|
|
# ── PostgreSQL 16 ─────────────────────────────────
|
|
pg:
|
|
image: postgres:16-alpine
|
|
container_name: xt-pg
|
|
restart: unless-stopped
|
|
environment:
|
|
POSTGRES_DB: ${PG_DB:-filldb}
|
|
POSTGRES_USER: ${PG_USER:-fill}
|
|
POSTGRES_PASSWORD: ${PG_PASSWORD:-fill_dev_pwd}
|
|
# 中文排序与大小写:用 C 排序 + UTF8,避免 locale 差异导致索引行为不一致
|
|
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C"
|
|
TZ: Asia/Shanghai
|
|
ports:
|
|
- "${PG_PORT:-5432}:5432"
|
|
volumes:
|
|
- pg-data:/var/lib/postgresql/data
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U ${PG_USER:-fill} -d ${PG_DB:-filldb}"]
|
|
interval: 5s
|
|
timeout: 3s
|
|
retries: 12
|
|
start_period: 10s
|
|
command:
|
|
- postgres
|
|
# 超大图处理是内存密集的,DB 侧保留默认即可,但把慢查询记下来
|
|
- -c
|
|
- log_min_duration_statement=1000
|
|
- -c
|
|
- timezone=Asia/Shanghai
|
|
|
|
# ── Redis 7 ───────────────────────────────────────
|
|
redis:
|
|
image: redis:7-alpine
|
|
container_name: xt-redis
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${REDIS_PORT:-16379}:6379"
|
|
volumes:
|
|
- redis-data:/data
|
|
command:
|
|
- redis-server
|
|
- --appendonly
|
|
- "yes"
|
|
- --requirepass
|
|
- "${REDIS_PASSWORD:-redis_dev_pwd}"
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "redis-cli -a ${REDIS_PASSWORD:-redis_dev_pwd} ping | grep PONG"]
|
|
interval: 5s
|
|
timeout: 3s
|
|
retries: 12
|
|
start_period: 5s
|
|
|
|
volumes:
|
|
pg-data:
|
|
redis-data:
|