Files
xiaotutongxue/backend/xt-server/src/main/resources/application.yml
T
lovife 1f3c485ceb feat(role,scope)!: 角色与授权可配 + 需求收敛(4 角色 / 10 菜单 / 删两模块)
角色与授权(交接摘要 §一·三十五):
- 权限判定合并两个来源:内置角色按代码(BuiltinRole)、自定义角色按库
  (sys_role_permission)。实现放 module 层的 DbRoleGrantSource,security 只依赖
  接口 RoleGrantSource —— 否则角色服务要调 permissionChecker,两个包迟早成环
- 权限判定必须加缓存:此前是零 IO,而压测基线是"SQL 条数恒定"。缓存放 Redis,
  空结果也缓存(否则已删角色的 token 会把库打穿)、Redis 挂了退化成直读库、TTL 只兜底
- V18 建 sys_role.user_type(账号的 user_type 一直从角色反推,自定义角色不在代码映射里)
  与 sys_role_menu;8 个接口 + 错误码 40045;契约 119 -> 129
- 内置角色只读(权限码是前后端契约,做成可改 = 一次误操作就能把管理员锁在系统外);
  平台级能力两道防线(界面禁用 + 服务端 40301);防自锁;改完立即生效(写授权清缓存)
- RoleProvisioner 从"已存在就 continue"改成幂等回填 + 每日 03:20 定时任务 ——
  修的是"代码改了权限、已开通租户永远停在发放那一刻",这种漂移不报错也没测试会红
- scripts/e2e-m10-role.py 77/77

需求收敛(交接摘要 §一·三十六,本节的数字为准):
- 删副班主任 / 审核员两个内置角色(6 -> 4)、历史整理器(module/cleanup)、
  加入申请(module/join + 学生端 pages/join)、collect_task_org.deputy_user_ids 整列;
  审核范围三级回退 -> 两级,连带 6 个 mapper 的 LIKE '%,id,%' 分支
- V19 迁移处理存量:先解 sys_user_role 绑定再软删角色;账号只在"除这两个角色外没有
  别的角色"时才软删。必须迁而不能只删代码 —— 角色码删掉后 mergePermissions 返回空集,
  存量账号会"能登录、处处 40301",不抛异常不打日志
- 契约 129 -> 119、错误码 59 -> 54、权限码 30 -> 28、PC 菜单 12 -> 10、
  小程序页 10 -> 9、原型 32 -> 29 屏、E2E 39 -> 37 个(断言 1695 条)
- UserService.list 对不认识的角色码由"静默丢掉过滤条件"改成失败关闭
  (之前传个不存在的 roleCode 会返回全校账号,且看起来完全正常)
- 品牌元信息同步改名「深学在线」:pom 名称、/doc.html 标题、配置与启动类注释、
  存储自检探针内容;学生端 app 名与全局导航栏标题
2026-10-10 16:48:54 +08:00

122 lines
4.0 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ═══════════════════════════════════════════════════════════
# 深学在线 · 主配置
# 环境差异全部放 application-{dev,test,prod}.yml
# ⚠️ 生产密钥一律走环境变量,不写在这里
# ═══════════════════════════════════════════════════════════
server:
port: 8080
# 上传接口是长连接,超时要放宽(学生可能从聊天记录选一个 40MB 的文件)
tomcat:
connection-timeout: 60s
max-swallow-size: 100MB
compression:
enabled: true
mime-types: application/json,text/html,text/css,application/javascript
min-response-size: 2048
spring:
application:
name: xt-server
profiles:
active: dev
# 额外挂一个 local 配置(backend/application-local.yml,**不提交**)。
# 用它放云存储密钥这类不该进仓库的东西;文件不存在时是空操作,不影响任何环境。
#
# ⚠️ 为什么不用 spring.config.import —— 试过,**优先级不够**:
# 导入的文件排在 profile 文件之后(优先级更低),于是
# application-dev.yml 里的 provider 会把它盖掉,表现是
# "文件明明配了 qiniu,启动后却还是本地磁盘",而且不会有任何报错。
# profile 文件是后加载的,优先级更高,行为符合直觉。
include: local
lifecycle:
# 优雅停机:等在途请求处理完,避免上传/导出被打断
timeout-per-shutdown-phase: 30s
jackson:
time-zone: Asia/Shanghai
default-property-inclusion: always
deserialization:
fail-on-unknown-properties: false
servlet:
multipart:
max-file-size: 50MB
max-request-size: 60MB
datasource:
driver-class-name: org.postgresql.Driver
hikari:
pool-name: xt-hikari
minimum-idle: 5
maximum-pool-size: 20
connection-timeout: 10000
idle-timeout: 600000
max-lifetime: 1700000
# 慢 SQL 从应用侧也记一份,方便和 PG 的 log_min_duration_statement 对照
leak-detection-threshold: 20000
data:
redis:
timeout: 3s
lettuce:
pool:
max-active: 16
max-idle: 8
min-idle: 2
max-wait: 3s
flyway:
enabled: true
locations: classpath:db/migration
# 迁移文件一旦发布就不许改,改了校验会失败——这是保护,不是障碍
validate-on-migrate: true
baseline-on-migrate: false
table: flyway_schema_history
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
# 生产环境关掉 SQL 日志,dev 单独开
log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
global-config:
banner: false
db-config:
# 软删除字段名,客户明确要求就叫 deleted
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
id-type: auto
management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: when-authorized
health:
redis:
enabled: true
springdoc:
api-docs:
path: /v3/api-docs
swagger-ui:
path: /doc.html
tags-sorter: alpha
operations-sorter: alpha
# ── 本项目业务配置 ────────────────────────────
fill:
# JWT 见《03-接口设计》§1.2:PC 8 小时 / 小程序 7 天
jwt:
issuer: tianbaotong-fill
pc-expire-seconds: 28800
mp-expire-seconds: 604800
# 密钥与 RSA/AES 密钥在 application-{env}.yml 或环境变量中提供
security:
# 登录失败锁定:5 次锁 15 分钟(§1.6)
login-max-fail: 5
login-lock-minutes: 15
# 连续失败几次后要求图形验证码
captcha-after-fails: 2
upload:
# 单文件上限 50MB(PRD §10.1)
max-file-size-mb: 50