Go to file
夏犀麟 d136c23874 fix(encrypt): 全量加密豁免 multipart 上传,修复文件上传被拒
问题:encrypt.fullBody=true 时,APICrypto 中间件会把所有非豁免请求的
body 当 JSON 解析取 {encryptedKey, encryptedData}。文件上传走
multipart/form-data,body 是二进制流,json.Unmarshal 必然失败,于是
被判定为「未加密的业务请求」直接拒绝(encrypted request required)。

而前端的请求拦截器对 FormData 是一律跳过加密的
(admin request.ts:`config.data instanceof FormData` 直接 return),
即上传请求本就以明文 multipart 发出。两端语义不一致,导致
fullBody 一开启,后台壁纸上传必然报错。

修复:新增 isMultipartRequest 判断,命中 multipart/form-data 的请求
跳过整体解密;响应侧因拿不到会话密钥(aesKeyB64 为空),保持明文
回传,与前端「FormData 请求不解密响应」的行为对齐。

dev 环境 fullBody=false,该路径不会被触发,故此前联调未暴露。
上传接口仍受 JWT 鉴权与 RBAC(POST + path 精确匹配)保护,豁免
整体加密不降低鉴权强度。
2026-09-14 02:33:43 +08:00
.gitea/workflows FIX: workflow Go 下载源改 aliyun 镜像(go.dev 偶发 SSL 错误 exitcode 35)+ 3 次重试 2026-08-27 00:54:33 +08:00
.workbuddy/memory feat: 招聘爬虫健壮性 + 通知记录增强(归档工作区留存改动) 2026-09-14 01:22:39 +08:00
api feat(wallpaper): 平台配置脱敏回显 + 图库元字段补齐 2026-09-14 01:48:23 +08:00
common feat(i18n): 中文化校验提示与服务层错误信息 2026-09-13 23:22:46 +08:00
deploy CFG: Gitea act_runner 自动部署(Go 交叉编译 + Docker 重建容器)+ 生产镜像 Dockerfile 2026-08-26 23:55:46 +08:00
docs feat: 招聘爬虫健壮性 + 通知记录增强(归档工作区留存改动) 2026-09-14 01:22:39 +08:00
hack feat(wallpaper): 壁纸模块后端(开源平台插件 + 自建图库 + 前后台接口) 2026-09-14 01:39:09 +08:00
internal fix(encrypt): 全量加密豁免 multipart 上传,修复文件上传被拒 2026-09-14 02:33:43 +08:00
manifest feat(wallpaper): 壁纸模块后端(开源平台插件 + 自建图库 + 前后台接口) 2026-09-14 01:39:09 +08:00
resource feat(dev): 项目初始化。 2026-07-17 17:58:08 +08:00
utility feat(dev): 项目初始化。 2026-07-17 17:58:08 +08:00
.gitattributes feat(dev): 项目初始化。 2026-07-17 17:58:08 +08:00
.gitignore feat: 招聘爬虫健壮性 + 通知记录增强(归档工作区留存改动) 2026-09-14 01:22:39 +08:00
AGENTS.md chore: CHANGELOG 纳入 git 管理;AGENTS.md 中央工作空间路径改相对引用 ../workbuddy.xpcool.com 2026-08-26 19:07:23 +08:00
go.mod feat(wallpaper): 壁纸模块后端(开源平台插件 + 自建图库 + 前后台接口) 2026-09-14 01:39:09 +08:00
go.sum feat(wallpaper): 壁纸模块后端(开源平台插件 + 自建图库 + 前后台接口) 2026-09-14 01:39:09 +08:00
main.go feat(i18n): 中文化校验提示与服务层错误信息 2026-09-13 23:22:46 +08:00
Makefile feat(dev): 项目初始化。 2026-07-17 17:58:08 +08:00
PROJECT_STRUCTURE.md feat(i18n): 中文化校验提示与服务层错误信息 2026-09-13 23:22:46 +08:00
README.MD feat(i18n): 中文化校验提示与服务层错误信息 2026-09-13 23:22:46 +08:00

service.xpcool.com — 个人多客户端后端服务

GoFrame v2 单体应用,为 mini / h5 / app 多端提供后端服务,并附带完整的后台管理体系。

核心业务用户认证JWT、看房数据小区/房源/成交/预售证)、招聘考试聚合、 站内通知、服务器安全日志后台管理RBAC 菜单权限 + 操作审计)。

面向 AI 助手的项目上下文见 AGENTS.md;每次变更的结构化记录见 docs/change-log/;目录树见 PROJECT_STRUCTURE.md

分层约定

调用链强制为 api → internal/controller → internal/service → internal/dao → internal/model(entity/do)

  • controller 只做 API 到 service 的适配,不碰 dao
  • 跨层出入参走 internal/model/dtointernal/model/voAPI 类型与 entity 不得越界;
  • 数据库操作必须用 DO 对象(internal/model/do),禁止 g.Map
  • 错误一律用 gerror(保留堆栈),响应统一走 internal/library/response

路由分组

三组路由在 internal/cmd/cmd.go 中注册:

前缀 用途 鉴权
/api/service/open 开放接口(前端直接调用) 公开,无鉴权
/api/service/user 用户端接口 登录公开,其余走 UserAuth
/api/service/admin 管理端接口 AdminAuth + 按「方法+路径」自动匹配权限码

管理端权限由后端从 admin_menutype=2 行,path"METHOD /路径")反查, 前端无需传 X-Permission;未配置映射的接口一律拒绝。

数据库模型生成

先在 MySQL 上执行 manifest/sql/ 下的迁移脚本,再设置 DB_DSN,然后运行:

gf gen dao -p internal -g default -gt -c

该命令是 internal/daointernal/model/dointernal/model/entity唯一来源,生成物禁止手改。

注意:部分模块(招聘、通知、自动任务、服务器安全日志)的表结构为手写 entity/do/dao 未走 gf gen,改动时请勿用生成命令覆盖。

本地启动

环境变量按 GF_GCFG_FILE 切换配置文件(config.dev.yaml / config.test.yaml / config.prod.yaml)。

  • 终端source .env.dev && go run main.go .env.dev 不入库,保存本地 DSN 与密钥)。
  • GoLand:运行配置 .run/service-dev.run.xml(项目级,重载项目后自动识别) 已注入 GF_GCFG_FILE / DB_DSN / JWT_SECRET,在运行下拉框中选择即可。 该文件含数据库口令,已加入 .gitignore

开发环境下,若 ${DB_DSN} / ${RECRUITMENT_DB_DSN} / ${JWT_SECRET} 占位符未被环境变量注入, injectEnv 会回填本地默认值,保证「零配置可启动」;生产(GF_GCFG_ENV=prod)不兜底,配置缺失显性报错。

构建与测试

go build ./...
go test ./...