文档目录
开始使用

架构概览

理解 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。

定制代码建议放在独立的自定义包中,而不是直接修改官方包。这样升级官方版本时冲突更少,也便于回滚。

请求处理流程

一次页面请求大致经历以下阶段:

  1. NaviServer 接收请求,匹配 URL 到具体的.tcl页面;
  2. OpenACS 引导层加载站点参数、用户会话与权限上下文;
  3. 页面脚本调用业务包中的过程获取数据;
  4. 页面模板(.adp)渲染 HTML;
  5. 响应返回浏览器,必要的审计信息写入数据库。

因为渲染发生在服务端,系统的首屏通常不依赖大量前端 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/ 页面如何调用它们。

延伸阅读