- name
- flycms-dev
- description
- FlyCms 项目(backend/ Spring Boot 4.1.1 + frontend/ vue-vben-admin v5)的架构地图与开发规范总纲。凡在本仓库做任何开发——写后端接口、新增/修改模块、管理页面、数据库变更、修 bug、重构——都要先加载本 skill 再动手,即使用户只说"改一下""加个功能";前端登录/菜单/权限专项另见 flycms-frontend-access skill。
# FlyCms 开发总纲
目标是让每次改动都长得像这个项目已有的代码,而不是像通用教程。细节 SOP 和决策记录在 references/ 里,先按需读:
- 新增后端模块/接口/管理页面 → 读 `references/backend-conventions.md`(含可直接套用的代码模板)
- 想引入新框架、改架构、或发现代码"不顺眼"想顺手重构 → 先读 `references/tech-debt.md`(技术债台账 + 已定的架构决策,多数"顺手改进"已被明确否决过)
- 前端登录/菜单/权限/按钮控制 → 触发 `flycms-frontend-access` skill,完整手册在 `docs/frontend-access-guide.md`
## 项目一张图
```
FlyCms/
├── backend/ Spring Boot 4.1.1 / JDK 25 / MyBatis(XML) / Freemarker / Ehcache / MySQL,端口 80
│ └── src/main/java/com/flycms/
│ ├── module/<域>/{dao,model,service}/ # 业务三层,DAO 接口与 XML 同目录
│ ├── web/front|system/ # 前台页面 / 管理后台(Freemarker 渲染)
│ ├── web/api/ # 给 vben 前端的 REST(/api/**,DataVo)
│ ├── interceptor/ # AdminInterceptor(/system/** URL 权限)、UserInterceptor
│ ├── core/{base,controller,entity,utils}/
│ └── config/ # WebMvcConfig(拦截器注册)、CorsConfig、Druid…
├── frontend/ vue-vben-admin v5 pnpm monorepo;主力应用 apps/web-antd,dev 端口 5666
└── docs/frontend-access-guide.md # 前后端权限对接手册(唯一信息源)
```
## 铁律(每条都有原因,违反即返工)
1. **DAO XML 统一放 `src/main/resources/mapper/`**(2026-09-29 G26 归位后的现行约定;文件名用 `模块__XxxDao.xml` 平铺)。`application.yml` 的 `mapper-locations` 扫 `classpath:mapper/**/*.xml`;`pom.xml` 已不再把 `src/main/java` 当资源目录——新 Mapper XML 放回 java 目录会静默不打包,启动报绑定失败。
2. **Controller 归位**:前台页面 → `web/front`;管理后台页面(含 Freemarker 渲染 + 局部 @ResponseBody)→ `web/system`,视图一律 `theme.getAdminTemplate("admin/xxx")` 返回;给 vben 前端的新 REST → `web/api`,路径 `/api/**`,返回 `DataVo`。不要在老 controller 里继续堆纯 JSON 端点。
3. **响应与分页**:JSON 一律 `DataVo`(成功 `DataVo.success(message, data)` 两参重载——单参重载有 message/data 分派陷阱);分页一律 `PageVo<T>`(service 里 `new PageVo<>(pageNum)`、`setRows`、`setList(dao.getXxx(pageVo.getOffset(), pageVo.getRows()))`、`setCount(dao.countXxx())`,XML 里手写 `limit #{offset}, #{rows}`)。
4. **ID 与表**:主键 `SnowFlake.nextId()`(`core/utils/SnowFlake.java`),表名 `fly_` 前缀、bigint 主键。SQL 全部走 DAO XML 的 `#{}` 预编译,禁止字符串拼接。
5. **校验与密码**:入参用 jakarta validation 注解 + `@Valid ... BindingResult` 逐条 `DataVo.failure(error.getDefaultMessage())`;密码存取只经 `BCryptUtils`;登录失败锁定逻辑(attempts)沿用 AdminService 现状,不要另造。
6. **权限闭环**:`/system/**` 下的新端点自动被 AdminInterceptor 按 URL 权限拦截——**上线前必须** `GET /system/admin/permission_sync` 注册 action_key 并在角色组勾选,否则所有人 403;`/api/**` 不在拦截范围,端点内必须自查 session 并对未登录抛 HTTP 401(vben 只认 401)。
7. **依赖卫生**:新代码用 commons-lang3 / commons-io 等现代坐标;`org.apache.commons.lang`(2.x)只出现在遗留代码里,不要模仿。
## 改完怎么验证(本项目无自动化测试,验证 = 编译 + 冒烟)
1. 后端:`cd backend && mvn -q compile` 过了再谈下一步;涉及启动行为的,`mvn spring-boot:run` 起服务后按"登录 → 菜单 → 目标页面/接口"冒烟。
2. 前端:`cd frontend && pnpm dev:antd` 起开发服(5666),改动涉及类型的跑 `pnpm check:type`;涉及登录/权限的按手册 §3 验收。
3. 数据库变更:在 `doc/` 下同步维护 SQL 变更说明,保持 `doc/flycms_date.sql` 是可建库的完整基线。
## 禁止事项(防腐化边界)
- 不引入新框架/新 ORM/新安全框架(Shiro、Spring Security、MyBatis-Plus、JWT…)。现行选型及理由见 `references/tech-debt.md` 的决策记录;确有必要,先在对话中提出权衡再动。
- 不改 `DataVo` 字段语义、拦截器路径规则、`/api` 代理契约——前端手册与 skill 都建立在这些契约上。
- 不做"顺手大重构"。发现坏味道记入 tech-debt 台账,单独立任务处理。
- 提交信息沿用仓库惯例:中文一行式动词开头(如"修复表名BUG")。
عرض على GitHub