文档目录
架构概览
理解 OpenACS 框架、NaviServer、PostgreSQL 与包机制如何组成 ]project-open[。
最后更新:2026-10-20
分层结构
]project-open[ 沿用 OpenACS 的经典分层:
浏览器
│ HTTP / 表单
▼
NaviServer(AOLserver 分支)
│ Tcl 解释器 + AOLserver 模块
▼
OpenACS 内核
│ 请求路由、权限、对象系统、包管理
▼
]project-open[ 业务包
│ 项目、工时、财务、翻译、CRM
▼
PostgreSQL
这四层各司其职:
- NaviServer 负责连接管理、静态资源与 Tcl 运行时;
- OpenACS 内核提供包(package)机制、对象系统、权限(permissions)与审计;
- 业务包以独立目录存在,可以单独安装、升级与定制;
- PostgreSQL承担数据存储与大量约束逻辑,很多业务规则通过数据库函数与视图实现。
包机制
OpenACS 中的“包”既是一组文件,也是一条数据库记录。一个典型的业务包包含:
packages/intranet-projects/
├── catalog/ # 页面元数据、消息键
├── lib/ # 可复用过程与查询
├── sql/postgresql/ # 建表、升级脚本
├── tcl/ # 应用逻辑与回调
├── www/ # 页面与资源
└── packages/*.info # 包声明与依赖
安装一个包时,系统会执行它的 SQL 脚本、注册页面与权限,并把包记录写入 apm_packages。升级时按版本依次执行增量 SQL。
定制代码建议放在独立的自定义包中,而不是直接修改官方包。这样升级官方版本时冲突更少,也便于回滚。
请求处理流程
一次页面请求大致经历以下阶段:
- NaviServer 接收请求,匹配 URL 到具体的
.tcl页面; - OpenACS 引导层加载站点参数、用户会话与权限上下文;
- 页面脚本调用业务包中的过程获取数据;
- 页面模板(
.adp)渲染 HTML; - 响应返回浏览器,必要的审计信息写入数据库。
因为渲染发生在服务端,系统的首屏通常不依赖大量前端 JavaScript;交互增强通过局部脚本实现。这与现代前后端分离架构不同,但在私有化部署和低带宽环境下更稳定。
数据模型要点
理解以下对象,能快速读懂大多数业务表:
| 对象 | 表前缀 | 说明 |
|---|---|---|
| 对象 | acs_objects |
所有业务对象的公共父表 |
| 权限 | acs_permissions |
对象级权限与角色继承 |
| 客户 | im_companies |
客户与供应商档案 |
| 项目 | im_projects |
项目主表,含父子项目关系 |
| 任务 | im_tasks |
任务、依赖与计划日期 |
| 工时 | im_hours |
人员、任务、日期与小时数 |
| 财务 | im_invoices、im_costs |
发票、成本与收入 |
所有业务对象都通过 object_id 关联到 acs_objects,因此可以统一挂载权限、评论、附件与审计记录。这是 OpenACS 建模的核心思想。
扩展点
常见的扩展方式有四类:
- 配置:通过站点参数与字典值调整行为,无需改代码;
- 自定义包:新增业务表与页面,复用核心对象与权限;
- REST 集成:外部系统通过
/intranet-rest/读写数据; - 数据库视图与函数:为报表或外部 BI 提供稳定接口。
什么时候需要读源码
以下情况建议直接阅读业务包源码与 SQL:
- 需要修改计费规则或税率计算;
- 需要新增一种项目类型及其权限模板;
- 需要把既有数据迁移进系统;
- 需要排查升级后页面报错。
阅读顺序建议:先看 sql/postgresql/ 了解表结构,再看 tcl/ 中的业务过程,最后看 www/ 页面如何调用它们。